加载图像时AsyncTask不会停止。

时间:2012-02-08 10:47:13

标签: android

这是我的AsyncTask,从适配器的getView调用:

class LoadImage extends AsyncTask<Object,Void,String>{

        private ImageView imv;
        private String path;

         public LoadImage(ImageView imv) {
             this.imv = imv;

        }

         Bitmap userAvatarStream = null ;
            Bitmap IconStream = null;
            URL IconURL;

            ProgressDialog dialog;
            @Override
                protected void onPreExecute(){
                    //Setting all the variables by getting the ids from the layout


                return;

                }


                @Override
                protected String doInBackground(Object... params) {

                    try {
                        IconURL = new URL(cr.ImageUrl);
                        IconStream = BitmapFactory.decodeStream(IconURL.openConnection().getInputStream());


                    }

                    catch (MalformedURLException e){
                        e.printStackTrace();
                    }
                    catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    return null;
                }


                 protected void onPostExecute(String result){
                        // ImageView user_avatar = (ImageView)v.findViewById(R.id.follower_user_avatar);

                    imv.setImageBitmap(IconStream);


                         return;


                }

我在这里遇到的问题是图像不断加载。让我们说我向下滚动,如果我向上滚动列表,图像就会再次刷新。它不断打电话来获取图像。这种行为显然是不可取的,除非在一个地方,如果手机上的互联网发生故障并再次出现,这将有助于自动加载图像。但是,在当前的状态下,即使它一直在崩溃,因为它不断打电话。如何阻止AsyncTask这样做?

3 个答案:

答案 0 :(得分:2)

只需将图像缓存到文件系统或内存中即可。

每次滚动列表时,都会调用getView。如果您将图像加载方法放在getView上并且没有使用图像缓存,那么它将一次又一次地下载图像。有一些开源图像加载器用于列表,具有缓存支持。

其中一个是droidFu。它支持两级缓存。文件系统和内存。从以下链接获取droidFu。

https://github.com/kaeppler/droid-fu

答案 1 :(得分:0)

尝试使用布尔标志来检查图像是否已成功加载。

如果不是那么只调用Load Image Asynctask。

如果适配器中有多行,您可能需要使用布尔数组来保留轨道。

答案 2 :(得分:0)

试试这段代码:

class performBackgroundTask extends AsyncTask<String, String, String> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog.setMessage("Please wait ...");
        dialog.setIndeterminate(true);
        dialog.setCancelable(false);
        dialog.show();  
    }

    @Override
    protected String doInBackground(String... arg0) {
        callxmlparser();
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);

        if (ringtoneNamelist != null && ringtoneNamelist.size() > 0) {
            songslist.setAdapter(new Songslist());
        } else {
            Toast.makeText(SongsList.this,"Network signal speed is too slow\ncannot parse the data from the server\n Please try again", Toast.LENGTH_LONG).show();
        }
        dialog.dismiss();   
    }
}