2012-08-10 4 views
12

私のアンドロイドアプリでは、クラウドからイメージをダウンロードします。ダウンロードはスレッドで実行され、同じスレッドでは、新たにダウンロードされたイメージでイメージビューを設定します。画像を設定したら、私はpostinvalidate()に電話します。すぐにイメージビューを更新する方法

しかし、画像はすぐに表示されません。再描画をすぐに行う方法はありますか?私は描画サイクルを起動する方法が必要です。

答えて

38

Viewクラスから派生した各クラスがinvalidate()postInvalidate()方法を持っている時に、すぐにではなく再描画されるように強制します。 invalidate()が呼び出されると、現在のビューが変更されたことがシステムに通知され、できるだけ早くに再描画する必要があります。この方法はからのみ呼び出すことができます。UIThreadではなく、依然としてビューが変更されたことをシステムに通知したい場合に別の方法が必要です。 postInvalidate()メソッドは非UIThreadからシステムに通知し、できるだけ早くUIThread上の次のイベントループにViewを再描画します。

AsyncTask(インテリジェントバックラウンドスレッド)の助けを借りて、あなたが望むものを達成することができます.AsyncTaskは、UIスレッドを適切かつ簡単に使用できるようにします。このクラスを使用すると、スレッドやハンドラを操作することなく、UIスレッド上でバックグラウンド操作(バックグラウンドで画像をダウンロード)を実行し、結果を公開することができます(ビットマップをImageViewに設定します)。

非同期タスクは、バックグラウンドスレッドで実行され、その結果がUIスレッドで公開される計算によって定義されます。非同期タスクは、Params、ProgressおよびResultと呼ばれる3種類のによって定義され、begin、doInBackground、processProgressおよびendと呼ばれる4 stepsです。

非同期タスクが実行されると、タスクは、4つのステップを経る手順:

onPreExecute()

は、タスクが実行された直後にUIスレッド上で呼び出されます。このステップは、通常、タスクを設定するために使用されます。たとえば、クラウドから画像をダウンロードする前にユーザーインターフェイスにプログレスバーを表示し、それを使用してユーザーエクスペリエンスを向上させます。

doInBackground(Params...) onPreExecute()の実行が終了した直後にバックグラウンドスレッドで呼び出されます。このステップは、バックグラウンド計算に長時間かかることがあります。非同期タスクのパラメータは、このステップに渡されます。計算結果はこのステップで戻され、最後のステップに戻されます。このステップでは、publishProgress(Progress ...)を使用して、1つ以上の進行単位を公開することもできます。これらの値は、UIスレッドのonProgressUpdate(Progress ...)ステップで公開されます。

onProgressUpdate(Progress...)publishProgress(Progress...)の呼び出し後にUIスレッドで呼び出されます。実行のタイミングは未定義です。このメソッドは、バックグラウンド計算がまだ実行されている間に、ユーザーインターフェイスに進捗状況を表示するために使用されます。

onPostExecute(Result)、バックグラウンド計算が終了した後にUIスレッドで呼び出されます。バックグラウンド計算の結果は、そのメソッドのパラメータとしてこのステップに渡され、ビットマップをimageViewに設定してビューを無効にすることができます。

+4

聖なる牛、ここに+1 – Korcholis

2

invalidate()を試しましたか?これは、ビューは、次のサイクル

+0

しかし、これはしかし、UIスレッドではありません... – user1583075

+0

:私は

image_url="myhost/img.png"; himg.setImageUrl(image_url, imageLoader); 

を持っている場合たとえば、私はこれを更新することができます'onPostExecute()'のときにそうすることができます。参照[ここ](http://stackoverflow.com/questions/3960886/problem-with-calling-invalidate-in-async-task-thread-in-android) – Korcholis

+0

ああ、今あなたの問題を参照してください。あなたが 'AsyncTask'を使用していたときはいつも期待していました。私のせい、申し訳ありません – Korcholis

0
new Thread(new Runnable() { 

      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       while (!socket.isClosed()) { 
        imgArray = receiveImagebytes(); 
       } 
      } 
     }).start(); 

     try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


while (!socket.isClosed()) { 
      runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        // TODO Auto-generated method stub 

        imageView.setImageBitmap(BitmapFactory.decodeByteArray(imgArray, 0, imgArray.length)); 
        imageView.invalidate(); 
       } 
      }); 
2

無効化が機能しません。 uriまたはurlまたは画​​像のパスを一時的に変更し、必要なパスに戻って変更します。私は今試していないが、それはそう

himg.setImageUrl(null, imageLoader); 
himg.setImageUrl(image_url, imageLoader) 
関連する問題