Android開発のAsyncTaskの使い方

3825 ワード

Androidで非同期タスクを実現するメカニズムには、HandlerとAsyncTaskの2つの方法があります.
Handlerモードでは、タスクごとに新しいスレッドを作成する必要があります.タスクが完了した後、Handlerインスタンスを介してUIスレッドにメッセージを送信し、インタフェースの更新を完了します.この方法は、プロセス全体の制御が比較的細かくなりますが、コードが相対的に肥大化しているなど、複数のタスクが同時に実行される場合、スレッドを正確に制御することは容易ではありません.Handlerに関する知識については、前にも紹介しましたが、よくわからない方はご参照ください.
操作を簡単にするためにAndroid 1.5ツールクラスandroidが提供されています.os.AsyncTaskは、非同期タスクの作成をより簡単にし、タスクスレッドとHandlerインスタンスを記述する必要がなくなり、同じタスクを完了します.
まずAsyncTaskの定義を見てみましょう.
public abstract class AsyncTask<Params, Progress, Result> {  

3つの汎用タイプは、「タスク実行を開始する入力パラメータ」、「バックグラウンドタスク実行の進捗状況」、「バックグラウンド計算結果のタイプ」を表します.特定の場合、すべてのタイプが使用するわけではない、使用されていなければjavaを使用することができる.lang.Voidタイプ代替.
非同期タスクの実行には、一般的に次のステップが含まれます.
1.execute(Params...params)は、非同期タスクを実行します.コードでこのメソッドを呼び出し、非同期タスクの実行をトリガーする必要があります.
2.onPreExecute()は、execute(Params...params)が呼び出された直後に実行され、バックグラウンドタスクを実行する前にUIにタグを付けるために一般的に使用されます.
3.doInBackground(Params...params)は、onPreExecute()が完了するとすぐに実行され、比較的時間のかかる操作を実行するために使用され、入力パラメータを受信し、計算結果を返します.実行中にpublishProgress(Progress...values)を呼び出して進捗情報を更新できます.
4.onProgressUpdate(Progress...values)は、publishProgress(Progress...values)を呼び出すと、このメソッドが実行され、直接UIコンポーネントに進捗情報が更新されます.
5.onPostExecute(Result result)バックグラウンド操作が終了すると、このメソッドが呼び出され、計算結果がパラメータとしてこのメソッドに渡され、UIコンポーネントに直接表示されます.
使用する際、注意すべき点はいくつかあります.
1.非同期タスクのインスタンスはUIスレッドで作成する必要があります.
2.execute(Params...params)メソッドはUIスレッドで呼び出さなければなりません.
3.onPreExecute()、doInBackground(Params...params)、onProgressUpdate(Progress...values)、onPostExecute(Result result)のいくつかのメソッドを手動で呼び出さないでください.
4.UIコンポーネントの情報をdoInBackground(Params...params)で変更することはできません.
5.1つのタスクインスタンスは1回しか実行できません.2回目の実行では例外が放出されます.
(以上の内容は以下から転載する:http://blog.csdn.net/liuhe688/article/details/6532519)
この方法をより深く認識するために,以下に一例として説明する.
この例では、プログレスバーのカウントダウン機能を実現します.時間が30 s長くなると、時間が経つにつれて進捗バーが徐々に短縮され、テキストボックスの残り時間も減少する.
import android.os.AsyncTask;
import android.widget.ProgressBar;
import android.widget.TextView;

class TestAsyncTask extends AsyncTask<String, Integer, String>  
{  
	FullscreenActivity activity;  
	TextView textView;
	ProgressBar bar;

	public TestAsyncTask(FullscreenActivity activity, TextView textView, ProgressBar bar ) {
		this.activity = activity;
		this.textView = textView;
		this.bar = bar;
	}
    //TestAsyncTask        , UI     ,           ,      
    @Override 
    protected void onPreExecute() {  
        // TODO Auto-generated method stub  
        super.onPreExecute();  
    }  

    //doInBackground     UI    ,          
    @Override 
    protected void onPostExecute(String result) {  
        // TODO Auto-generated method stub  
    	
    	
        //textView.setText(result);  
        super.onPostExecute(result);  
    }  

    // PreExcute      AysncTask       ,      UI    
    @Override 
    protected String doInBackground(String... params) {  
        // TODO Auto-generated method stub  
        bar.setMax(300);
        int i = 30;
    	while(true)
    	{
    		publishProgress((int)i);
    		if(i == 0 ) break;
    		try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    		i--;
    		
    	}
        return null;  
    }
	@Override
	protected void onProgressUpdate(Integer... values) {
		// TODO Auto-generated method stub
		bar.setProgress(values[0]*10);  
        textView.setText("" + values[0] + " s");  
		
		super.onProgressUpdate(values);
	}  
    
       
}  

UIスレッド:
new TestAsyncTask(FullscreenActivity.this, textView, bar).execute("");

以上,AsyncTaskを用いて非同期更新プログレスバーを実現した.プログラムの実行に影響を及ぼさず、バックグラウンドでフロントエンドUIを更新し続けることができます.
この方法は、処理の進捗、タイミング、ロードの進捗などの機能を表示するためにも使用できます.