【问题标题】:Progress Bar Small while the downloaded image is not visible进度条小而下载的图像不可见
【发布时间】:2012-10-22 23:59:10
【问题描述】:

目前,我有一个类来下载 Asynctask 的图像扩展。 我想实现一个小的进度条来向用户显示该空间中加载的图像。我试图将 Asynctask 类放在类活动中。现在的问题是调用类我需要类是静态的。但是如果我把静态类我不能控制进度对话框。

我的班级下载图片:

public class DownloadImages extends Activity{

    public class DownloadImage extends AsyncTask<String, Void, Bitmap> {
        ImageView bmImage;
//      progressBar = new ProgressBar(activity, null, android.R.attr.progressBarStyleSmall);

        public DownloadImage(ImageView bmImage) {
            this.bmImage = bmImage;
        }

        protected Bitmap doInBackground(String... urls) {
            String urldisplay = urls[0];
            Bitmap mIcon11 = null;

            try {
                InputStream in = new java.net.URL(urldisplay).openStream();
                mIcon11 = BitmapFactory.decodeStream(in);
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return mIcon11;
        }
        protected void onPostExecute(Bitmap result) {
            bmImage.setImageBitmap(result);
            Log.e("TAG","IMAGEN CARGADA");
        }

    //    protected void onPreExecute(){
    //    }
    }
}

要创建 ProgressBar,我认为我需要将类设为 Activity:

progressBar = new ProgressBar(activity, null, android.R.attr.progressBarStyleSmall);

这是我为我的问题创建的解决方案:

public class DownloadImages extends Activity{

    ProgressBar progressBar = new ProgressBar(DownloadImages.this, null, android.R.attr.progressBarStyleSmall);

    public class DownloadImage extends AsyncTask<String, Void, Bitmap> {
        ImageView bmImage;

        public DownloadImage(ImageView bmImage) {
            this.bmImage = bmImage;
        }

        protected Bitmap doInBackground(String... urls) {
            String urldisplay = urls[0];
            Bitmap mIcon11 = null;

            try {
                InputStream in = new java.net.URL(urldisplay).openStream();
                mIcon11 = BitmapFactory.decodeStream(in);
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return mIcon11;
        }
        protected void onPostExecute(Bitmap result) {
            bmImage.setImageBitmap(result);
            Log.e("TAG","IMAGEN CARGADA");
        }

        protected void onPreExecute(){
            progressBar.setVisibility(View.VISIBLE);
        }
    }
}

现在的问题是如果我调用DownloadImage,这个类必须是静态的,但是如果我做静态我不能使用progressBar,除非它被声明为静态,如果我认为静态我不能用我的活动。

有什么办法吗?

谢谢,抱歉我的英语不好

【问题讨论】:

    标签: android progress-bar static-class


    【解决方案1】:

    使用 Wea​​kReference 获取您从中调用 DownloadImage 类的 Activity 的 Context,ProgressBar 在其构造函数的第一个参数中需要 Context。

    public class DownloadImages extends Activity{
    
    ProgressBar progressBar = new ProgressBar(DownloadImages.this, null, android.R.attr.progressBarStyleSmall);
    
    public static class DownloadImage extends AsyncTask<String, Void, Bitmap> {
        ImageView bmImage;
        private WeakReference<DownloadImages> mWeakReference;
    
        public DownloadImage(DownloadImages downloadImages, ImageView bmImage) {
            this.bmImage = bmImage;
            mWeakReference= new WeakReference<DownloadImages>(downloadImages);
        }
    
        protected Bitmap doInBackground(String... urls) {
            String urldisplay = urls[0];
            Bitmap mIcon11 = null;
    
            try {
                InputStream in = new java.net.URL(urldisplay).openStream();
                mIcon11 = BitmapFactory.decodeStream(in);
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return mIcon11;
        }
        protected void onPostExecute(Bitmap result) {
            bmImage.setImageBitmap(result);
            Log.e("TAG","IMAGEN CARGADA");
        }
    
        protected void onPreExecute(){
            mWeakReference.get().progressBar.setVisibility(View.VISIBLE);
        }
    }
    

    }

    现在在启动 AsyncTask 时从 Activity 传递“this”。

    【讨论】:

    • 似乎是一个不错的解决方案。我现在怎么调用?,之前是这样调用的,但是现在我需要添加另一个参数new DownloadImages.DownloadImage((ImageView)vArea.findViewById(R.id.img_area)).execute(areas.get(o).p2);
    • DownloadImages.DownloadImage((this, ImageView)vArea.findViewById(R.id.img_area)).execu‌​te(areas.get(o).p2);如果这可以解决您的问题,也请接受答案,以便其他人知道:)
    • 语法错误?什么类型,基本上需要传递的是那边的Activity对象。检查一下
    • 我也试试:new DownloadImages.DownloadImage(this, (ImageView)vArea.findViewById(R.id.img_area)).execute(areas.get(o).p2); 但不正确
    • 等等……让我明白,你有 Activity A 和 Activity B,B 有 AsyncTask,A 调用这个 AsyncTask……我不知道为什么你需要从 Activity A 调用 AsyncTask ?您应该始终从同一个活动中调用异步任务。请帮助我了解您的情况。
    【解决方案2】:

    只需将您的 ProgressBar 实例传递给 DownloadImage 任务构造函数即可。

    就像这样(我假设您从活动创建 AsyncTask,所以this 将指向它):

    Progressbar progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleSmall);
    DownloadImage downloadImage = new DownloadImage(someImageView, progressBar);
    

    并更改您的构造函数,使其可以将ProgressBar 作为参数。

    【讨论】:

      猜你喜欢
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多