C/C++プログラマの管理者が, Androidプログラムにチャレンジ. AndroidプログラミングのTipsをメモっていく予定です.

比較的重い処理(画像処理, DBアクセス, HTTPダウンロード等)をUIスレッドに負荷を与えずバックグラウンドで処理したい場合, AsyncTaskクラスを利用する.
他にも「IntentServiceで非同期処理を行う」でも実現できる.

バックグランド処理

  • MainActivity.java
    • AsyncTaskのサブクラスのインスタンスを生成する.
    • AsyncTask#executeメソッドで, 非同期(スレッド)処理を実行する.
    • AsyncTaskサブクラスを実装する.
   AsyncTask<型1, 型2, 型3>
     型1 ... AsyncTask#executeメソッドの引数の型 / AsyncTask#doInBackgroundメソッドの引数の型
     型2 ... AsyncTask#onProgressUpdateメソッドの引数の型
     型3 ... AsyncTask#doInBackgroundメソッドの戻り値の型 / AsyncTask#onPostExecuteメソッドの引数の型
    • AsyncTaskのサブクラスのコンストラクタを必要に応じて実装する.
    • AsyncTask#onPreExecuteメソッドを必要に応じて実装する. バックグラウンド処理の実行前に実行される.
    • AsyncTask#onPostExecuteメソッドを必要に応じて実装する. バックグラウンド処理完了後に実行される.
    • AsyncTask#doInBackgroundメソッドに, バックグラウンド処理の内容を実装する.
package com.moonlight_aska.android.asynctask01;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button btnStart = (Button)findViewById(R.id.btn_id);
    // Buttonのイベントハンドラ
    btnStart.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
        SampleAsyncTask task = new SampleAsyncTask();
        // 非同期処理の開始
        task.execute();
      }
    });
  }

  // AsyncTaskのサブクラス
  private class SampleAsyncTask extends AsyncTask<Void, Long, Long> {
    TextView mText;
    Button mBtn;
    Long mSec;

    // コンストラクタ
    public SampleAsyncTask() {
      mText = (TextView)findViewById(R.id.text_id);
      mBtn = (Button)findViewById(R.id.btn_id);
    }

    // バックグラウンド処理の前に実行される処理
    @Override
    protected void onPreExecute() {
      // TODO Auto-generated method stub
      Log.v("AsyncTask", "onPreExecute");
      mBtn.setEnabled(false);
      mSec = 0L;
    }

    // バックグラウンド処理完了後に実行される処理
    @Override
    protected void onPostExecute(Long result) {
      // TODO Auto-generated method stub
      Log.v("AsyncTask", "onPostExecute");
      mBtn.setEnabled(true);
    }

    // バックグラウンド処理
    @Override
    protected Long doInBackground(Void... params) {
      // TODO Auto-generated method stub
      Log.v("AsyncTask", "doInBackground");
      try {
        for (int i=0; i<10; i++) {
          Thread.sleep(1000);
          mSec++;
          Log.v("AsyncTask", mSec + "sec");
        }
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
      return mSec;
    }
  }
}
  • 実行例




コメントをかく


ユーザーIDでかく場合はこちら
「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu


逆引き(基礎編)

画面表示/操作(49)

フラグメント(1)

逆引き(Android Things)

周辺I/Oポート(2)

逆引き(応用編)

AD



管理人のみ編集できます