0

GillesDebunneがMultithreadingForPerformanceで説明しているように、ImageDownloaderを使用していますが、簡単な拡張機能を作成したいと思います。

ProgressBarまだダウンロードされていない各リストアイテムに不確定を追加したいと思います。私はそれを次のように呼び出すことによって、ほとんどセットアップしました:

progressBar.setVisibility(View.VISIBLE);    // in the AsyncTask preExecute()
progressBar.setVisibility(View.INVISIBLE);  // in the AsyncTask postExecute()

具体的には、imageViewのビットマップが次のpostExecute()ように設定されるとすぐにプログレスバーを非表示にマークします。

if (this == bitmapDownloaderTask) {
    imageView.setImageBitmap(bitmap);
    progBar.setVisibility(View.INVISIBLE);
}

しかし、最初にプログレスバーをに表示するための適切なテストを見つけることができませんでしたpreExecute()。私は次のさまざまな組み合わせを試しました:

if (imageView == null)
if (imageView.getDrawingCache() == null)
if (downloadedDrawable == null)
if (downloadedDrawable.getColor() == Color.BLACK)

誰かがこれを機能させる方法についての提案がありますか?つまり、特定のビットマップが設定されているかどうかを判断するためのこのコードの適切なテストは何ですか?ありがとう!

4

1 に答える 1

0

preExecute で imageView が null になるのはなぜですか。つまり、なぜテストが必要なのですか? わかりました、あなたが参照したブログでは、画像ビューへの弱い参照を使用しています。彼が onPostExecute で行っているように、null であることをテストします。

        ImageView imageView = imageViewReference.get();
        if (imageView != null) {

これが発生する唯一の方法は、AsyncTask が開始されていないが、画像ビューを含むアクティビティが終了して画面から削除された場合です。これは可能性があるため、テストすることをお勧めします。null の場合は、すぐに cancel を呼び出す必要があります。

ダウンロードされた Drawable (ビットマップなど) は、まだダウンロードされていないため、preExecute には存在しません。

あなたのテスト:

if (this == bitmapDownloaderTask) {

冗長に思えます。bitmapDownloaderTask ではないのはいつですか?

[編集]しかし、プログレスバーを表示するためにイメージビューをテストする必要があるのはなぜですか? onPreExecute で表示し (キャンセルされていない場合)、onPostExecute で非表示にしないのはなぜですか?

于 2012-11-27T17:19:55.117 に答える