同学们,有遇到java.io.IOException: create cache file error的么?谢谢告知处理方式

Water_Marking 2016-05-09 05:24:02
java.io.IOException: create cache file error:http://www.atguigu.com//images/zhaopin.jpg?
at org.xutils.http.loader.FileLoader.initDiskCacheFile(FileLoader.java:275)
at org.xutils.http.loader.FileLoader.load(FileLoader.java:180)
at org.xutils.http.loader.FileLoader.load(FileLoader.java:41)
at org.xutils.http.request.UriRequest.loadResult(UriRequest.java:76)
at org.xutils.http.request.HttpRequest.loadResult(HttpRequest.java:265)
at org.xutils.http.HttpTask$RequestWorker.run(HttpTask.java:607)
...全文
475 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Water_Marking 2016-05-12
  • 打赏
  • 举报
回复
好吧,已经重装系统,重新走了一遍。完美。
Water_Marking 2016-05-09
  • 打赏
  • 举报
回复
引用 3 楼 wudz0826 的回复:
下载图片的模块啊,贴出来具体代码
public class WebPicturesActivity extends Activity {


    //声明视图组件
    private TextView tv_webpictures_top;//显示文本信息
    private CheckBox cb_pictures_select; //勾选图片
    private ImageView iv_webpictures_download; //下载或删除图片
    private Button btn_pictures_stop; //停止抓取图片
    private ProgressBar pb_webpictures_loading; //深度抓取进度
    private GridView gv_webpictures_loading; //抓取图片列表

    private ImageAdapter adapter ;

    public static  boolean isEdit ;//记录当前Activity中View中的一个小图片是不是编辑状态,我在ImageAdapter中使用


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_pictures);


//        //获得一下Intent带过来的URL
//        Intent intent = getIntent();
//        String url = intent.getStringExtra("url");
//        Log.e("TAG",url);

        //拿到这个URL后,先不着急去联网,先设置layout布局的设置--比较麻烦,涉及到checkbox的样式的设置。
        //弄完layout布局以后,再弄layout中的item 布局。
        //两个都弄完了,然后让手机屏幕成为常亮状态.

        //保持屏幕常亮
        getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
                WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
        );

        //然后初始化视图对象,写成一个方法,在这里调用。
        init();













    }
    public String url ;

    private void init() {//初始化视图组件

        //先视图对象的初始化
        tv_webpictures_top = (TextView) findViewById(R.id.tv_webpictures_top);
        cb_pictures_select = (CheckBox) findViewById(R.id.cb_pictures_select);
        iv_webpictures_download = (ImageView) findViewById(R.id.iv_webpictures_download);
        btn_pictures_stop = (Button) findViewById(R.id.btn_pictures_stop);
        pb_webpictures_loading = (ProgressBar) findViewById(R.id.pb_webpictures_loading);
        gv_webpictures_loading = (GridView) findViewById(R.id.gv_webpictures_loading);


        adapter = new ImageAdapter(this);//拿到外面声明,确保让外面的方法都能看到

        gv_webpictures_loading.setAdapter(adapter);//此时集合中没有数据



        /**
         * 现在的目的是第一次联网获取每个图片的url
         *
         * 怎么实现的,借助于导入的第三方工具xUtiles,先得到访问的整个页面的html 代码,再用jsoup 解析
         * html 代码,就得到了所有图片的url 。
         *
         */

        url = getIntent().getStringExtra("url");
        url = AppUtils.checkUrlPre(url);//必须调用有返回值的此方法



        //联网操作--封装成一个方法,在此处调用。能获取整个页面的html代码,最终能返回一个图片,让adapter来我们放到该放的位置去
        getHttpImage(url);









        /**
         *最终的时候,我是要通过调用我ImageAdapter的notifixxxxxxx方法,用来更新视图
         *
         *
         * 为什么是这个样子,因为第一次联网,得到的那些个图片的url 不是我感兴趣的,这些url 后的图片才是我
         * 想盗取的,所以一开始显示出来的是一些url ,我通过不断的调用notifixxxxxxx方法来更新显示,当在调
         * 用notifixxxxxxx方法的时候,其实还涉及到了getView() 方法的执行调用,所以去那里设置一下。
         *
         *
         */

//        adapter.notifyDataSetChanged();









    }

    private ProgressDialog dialog ;
    private List<ImageBean> imageBeansList= new ArrayList<ImageBean>() ;//是用户保存的,通过jsoup解析的所有图片的对象。也是后期用Adapter重新装数据的集合。
    private Set<ImageBean>  imageBeanSet = new HashSet<>();//是用来过滤相同图片的集合。
    /**
     * 这是联网的具体的操作
     *
     * @param url
     */
    private void getHttpImage(final String url) {

        Log.e("TAG","正在抓取图片的过程中。");
        //先显示一个Dialog,说正在盗取xxx 网站的图片,请等待--但是我把showProgressDialog()写在另外一个地方
        showProgressDialog("正在抓取" + url + "网站的图片", true);

        //利用xUtiles工具联网得到整个页面的html
        x.http().get(new RequestParams(url), new Callback.CommonCallback<String>() {

            /**
             * 正确联网,得到返回的数据
             *
             * @param html
             */
            @Override
            public void onSuccess(String html) {
                //先Log一下
                Log.e("TAG", html);

                //保证请求之前集合数据是空的[保不齐上次打开过应用,集合里面有数据,对这次造成影响]
                imageBeansList.clear();
                imageBeanSet.clear();

                //这里涉及到拿着这页面的url和 一整个页面的html 交给Jsoup进行解析
                showImagesFromHtml(url, html);


                dialog.dismiss();//到此,访问的该网站的所有的图片应该都显示在手机上了。但是并没有
                //就当我的所有的图片已经加载出来了。


                //提示是否进行深度抓取的Dialog放在这里。
//                showDeepSearchDialog(url,html);




            }


            /**
             * 请求网站失败,没有返回任何有意义的html
             *
             * @param ex
             * @param isOnCallback
             */
            @Override
            public void onError(Throwable ex, boolean isOnCallback) {

                Toast.makeText(WebPicturesActivity.this, "请求网站失败", Toast.LENGTH_SHORT).show();
                dialog.dismiss();
            }

            /**
             * 取消了网站的请求
             * @param cex
             */
            @Override
            public void onCancelled(CancelledException cex) {

            }

            //结束网站的请求的时候
            @Override
            public void onFinished() {
                Toast.makeText(WebPicturesActivity.this, "抓取图片成功。", Toast.LENGTH_SHORT).show();
            }
        });



    }

    /**
     * 深度抓取的Dialog代码写在这里
     *
     * @param url
     * @param html
     */
    private void showDeepSearchDialog(String url, final String html) {
        new AlertDialog.Builder(this)
                .setTitle("请确认")
                .setMessage("首页图片已经抓取完成,是否需要深度抓取" + url + "站点的图片")
                .setPositiveButton("深度抓取", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //深度抓取
//                        deepSearch(html);
                        Log.e("TAG","能不能执行到这里!!!!!!!!!!!!!!!");
                    }
                })
                .setNegativeButton("下回吧", null)
                .show();






    }




    /**
     *
     * 显示一下html上所有的图片
     *
     *[1]获得整个页面的html 代码,再通过jsoup解析html代码解析成一个一个的图片的String
     *[2]用Set集合去装一下这些String类型的数据,以进行去重,把重复过滤。
     *
     * @param url
     * @param html
     */
    private void showImagesFromHtml(String url, String html) {
        List<ImageBean> list = parseHtml(url, html);//这里才是真正的jsoup解析
        Log.e("TAG", list.toString());
//        imageBeanSet.addAll(list);//将二级页面的图片对象整体都加到imageBeansList 中来。//现在还是深度抓取

        imageBeansList.addAll(list);
        //接下来是用adapter来处理得到的总体的imageBeansList 集合
        adapter.setList(imageBeansList);
//        //这个地方不能用add,因为你一上来,就深度抓取图片。但是这个时候imageBeansList 还是null,不能用add。
//        adapter.addList(imageBeansList);

        adapter.notifyDataSetChanged();//更新视图,工作原理是不停的重绘,直到最后一个图片显示完。



    }


    /**
     * 这里才是真正的jsoup解析-----网上查看,找方法理解---反正我这里是直接粘过来的==#
     *
     *
     * 概述jsoup的解析过程:
     * [1]新建一个ArrayList集合,泛型为 ImageBean。用以盛装包含url地址的ImageBean 对象。
     * [2]通过Jsoup的静态方法 parse(html),把得到的html放入,得到Document类型的 doc对象。
     * [3]调用doc对象的getElementsByTag("img")方法,把标签是“img”的标签对象拿出来。
     * [4]进入循环,调用标签img的attr("src")方法,得到标签中的字符串src,src即图片的相对路径。
     *    在这些src中,只保留以jpg 和 png 结尾的。
     *    再通过checkSrc(url, src)方法,返回得到完整的单个图片的绝对路径src ,用以得到每一个单个的图片。
     *    new一个ImageBean(src)对象,把src 传进去,得到imageBean。
     *    再在imageBeanSet中调用contains(imageBean)方法,过滤掉重复的imageBean对象
     * [6]不停的重复以上方法,直到得到最后一个图片的src。
     * [7]返回
     * @param url
     * @param html
     */
    private List<ImageBean> parseHtml(String url, String html) {
        List<ImageBean> list = new ArrayList<>();//这个list用于装html中,包含url地址的ImageBean的[图片]对象
        Document doc = Jsoup.parse(html);
        List<Element> imgs = doc.getElementsByTag("img");
        for (Element img : imgs) {
            String src = img.attr("src");
            Log.e("TAG",src);
            if (src.toLowerCase().endsWith("jpg") || src.toLowerCase().endsWith("png")) {
                src = checkSrc(url, src);//得到完整的单个图片的绝对路径用以得到每一个单个的图片
                Log.e("TAG",src);
                ImageBean imageBean = new ImageBean(src);
                //在imageBeanSet中过滤掉重复的imageBean对象
                if (!imageBeanSet.contains(imageBean) && src.indexOf("/../") == -1) {
                    imageBeanSet.add(imageBean);
                    list.add(imageBean);
                }
            }
        }
        return list;

    }

    /**
     *这里这个方法是把jsoup剥离出来的图片的相对路径src 变为一个完整的绝对网址url
     *
     *
     * 为什么?因为通过jsoup来剥离出来了好多单个的以img/png/jpng等结尾的字符串,
     * 但是,我哪知道xxxx.img到底是哪个网站上的图片,我不得在这个方法里补全一下得到完整的网址么。
     *
     * @param url
     * @param src
     * @return
     */
    private String checkSrc(String url, String src) {
        if(src.startsWith("http")) {
            url = src;
        }else if(src.startsWith("/")) {
            url = url +src ;
        }else {
            url = url + "/" + src ;
        }

        return url;

    }

    /**
     *
     * 最开始,联网下载整个页面html时显示dialog 的方法
     * @param message
     * @param flag
     */

    private void showProgressDialog(String message ,boolean flag){
        dialog = new ProgressDialog(this);
        if(flag) {
            dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);//圆形的Dialog

        }else{
            dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//水平的Dialog
        }

        dialog.setTitle("提示信息");
        dialog.setMessage(message);
        dialog.show();


    }

}
Water_Marking 2016-05-09
  • 打赏
  • 举报
回复
引用 3 楼 wudz0826 的回复:
下载图片的模块啊,贴出来具体代码
自学阶段,打的注释有点多,不要笑话我哈
闷骚的小老头 2016-05-09
  • 打赏
  • 举报
回复
下载图片的模块啊,贴出来具体代码
Water_Marking 2016-05-09
  • 打赏
  • 举报
回复
跟着视频做了一个在网上抓图的应用,各个图的网址什么的都能得到,但是就是显示不出来,只是显示一个缺省的图片。在日志里点击我获得的html 的图片的url,也能在电脑网页上显示出来,报我上面贴的这个异常。我在网上查了半天没找到解决方式。大家有遇到过这种问题的或者是知道怎么解决问题的吗?虚心求教,刚注册的 账号,分数不多,嘿嘿嘿!!
Water_Marking 2016-05-09
  • 打赏
  • 举报
回复
报错说是导的框架错了,我头都大了。哪里的错啊。

80,472

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧