0

現在、Asynctask の拡張イメージをダウンロードするクラスがあります。ユーザーに画像がそのスペースに読み込まれていることを示す小さな進行状況バーを実装したいと思います。Asynctask クラスをクラス アクティビティ内に配置しようとしました。問題は、クラスを静的にする必要があるクラスを呼び出すことです。しかし、静的クラスを配置すると、進行状況ダイアログを制御できません。

私のクラス DownloadImage:

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 を作成するには、クラスをアクティビティにする必要があると思います。

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 を使用できず、静的だと思う場合はアクティビティで作成できません。

解決策はありますか?

ありがとう、私の下手な英語でごめんなさい

4

2 に答える 2

0

WeakReferenceを使用して、DownloadImageクラスを呼び出しているアクティビティのコンテキストを取得します。ProgressBarでは、コンストラクターの1番目のパラメーターに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」を渡します。

于 2012-11-02T10:30:50.527 に答える
0

ProgressBarインスタンスをDownloadImageタスク コンストラクターに渡すだけです。

単純に次のようにします(アクティビティから AsyncTask を作成すると仮定しているので、それthisを指します):

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

コンストラクターを変更ProgressBarして、パラメーターとして取得できるようにします。

于 2012-11-02T10:25:17.793 に答える