マウスクリックのコードに応答して、単独スレッドで画像をダウンロードし、ImageViewで表示することができます.


下記のコードはよく作動できますか?なぜですか?もしだめならどうやって最適化しますか?
      public void onClick(View v){

           Bitmap b=loadImageFromNetwork("http://example.com/image.png");

           mImageView.setImageBitmap(b);      

}
以上の単一スレッドモードの説明によれば、プログラムインターフェースの応答能力を保証するためには、UIスレッドをブロックできないことが鍵となる.動作が速くできない場合は、個々のスレッド内で実行させるべきである(「バックグラウンド」または「作業スレッド」).
例えば、以下のようにマウスクリックのコードに応答して、単独スレッドで画像をダウンロードし、ImageViewで表示することができます.
public void オンクレック(View) v) { 
    new Thread(new Runnable() { 
        public void run() { 
            Bitmap b = loadImageFroomNetwork("http://example.com/image.png"); 
            mImageView.setImageBitmap(b) 
        } 
    }).start(); 
)
このコードは、一見、ネットワークにアクセスするための新しいスレッドを作成して処理することができるようです.しかし、シングルスレッドモードの第二のルールに違反しています.UIスレッド以外でAndoidのUIコンポーネントパッケージにアクセスしないでください.以上の例は、UIスレッドではなくImageViewを修正しました.これは、不明確な結果となります.この状況をフォローするのも大変です.時間がかかります.
上記の問題を解決するために、Androidは他のスレッドからUIスレッドにアクセスするいくつかの方法を提供しています.
・       Activity.run OnUiThread(Runnable)
・       View.post(Runnable)
・       View.postDelayed(Runnable、long)
 
例えば、View.post(Runnable)方法を使用して上記のコードを修正することができます.
public void オンクレック(View) v) { 
    new Thread(new Runnable() { 
        public void run() { 
            final Bitmap bitmap = loadImageFroomNetwork("http://example.com/image.png"); 
            mImageView.post(new Runnable() { 
                public void run() { 
                    mImageView.setImageBitmap(bitmap) 
                } 
            }); 
        } 
    }).start(); 
)
以上のコードの実行は現在スレッドが安全です.ネットワーク関連の操作は別々のスレッドで行われています.ImageViewはUIスレッドで操作されています.
しかし、操作がますます複雑になるにつれて、これらのコードも複雑になり、維持が難しくなります.作業スレッドを使って、より複雑なインタラクション処理を行うために、作業スレッドの中で、Handlerを使ってUIスレッドから配信されたメッセージを処理することが考えられます.もちろん、最善の解決策は、非同期タスククラスのAyncTaskを引き継ぐことかもしれません.このような作業スレッドとUを簡略化しました.I相互作用の操作
 
非同期のタスクを使う
非同期タスクAyncTask 非同期的な方法でユーザーインターフェースを操作することができます.作業スレッドをブロックしてからUIスレッドに結果を表示します.このプロセスではスレッドとHandlerを人工的に干渉する必要がありません.
非同期タスクを使用するには、AyncTaskクラスを引き継ぎ、doInBackground()コールバック方法を実装しなければならない.このオブジェクトは、バックグラウンドスレッドプールで実行されます.UIを更新するには、onPostExecute()方法を実装して、doInBackground()を配信する必要があります.この方法は、UIスレッドで実行されているので、安全にUIを更新することができます.その後、exutece UIを呼び出すことができます.任務を遂行しました.
例えば、上記の例は、AyncTaskを利用して実施されてもよい.
public void オンクレック(View) v) { 
    new DownloadImageTask().execute("http://example.com/image.png"); 

 
prvate クラス DownloadImageTask extens AsyncTask { 
    /** The system cals this to perform work in work thread and 
      * delivers it the parameters given to AyncTask.execute()*/ 
    protected Bitmap doInBackground(String... urls { 
        return loadImageFroomNetwork; 
    } 
     
    /** The system cals this to perform work in the UI thread and delivers 
      * the result from do InBackground()*/ 
    protected void onPostExecute(Bitmap) レスリング { 
        mImageView.setImageBitmap(reult) 
    } 
)
現在のUIは安全であり、コードも簡略化されており、作業スレッド内で完了した部分とUIスレッド内で完了した部分に分解されているからである.
このクラスの使用を全面的に理解するには、AyncTaskの参考文献を読む必要があります.以下はその働き方についての概要です.
・       パラメータ、進捗値、タスクの最終値の種類は、generisで指定できます.
・       作業スレッド内のdoInBackground()方法は自動的に実行されます.
・       OProExecute()、onPostExecute()、およびonProgress Update()の方法は、UIスレッドで起動されます.
・       doInBackground()の戻り値は、onPostExecute()に伝えられます.
・       doInBackground()内のいつでも、UIスレッド内のonProgress Updateを実行するために、publish Progress()を呼び出すことができます.
・       タスクは、いつでも、スレッド内でキャンセルできます.
注意:ワークスレッドを使用すると、他の問題が発生する可能性があるのは、動作構成の変更(例えば、ユーザが画面の向きを変えたこと)です.activityの予期せぬ再起動によって、この作業スレッドが破壊される可能性があります.この場合、タスクの実行を維持する方法と、activityが破壊された時にどのようにタスクを正しくキャンセルするかを確認するには、Shelvesルーチンのソースコードを参照してください.