非同期(スレッド)処理中にタイトルバーへプログレスアイコンを表示する

非同期(スレッド)処理中だということは、

ユーザに分かるようにしておいたほうが親切ですので、

タイトルバーへプログレスアイコンを表示する方法を記載します。

Activity の onCreate() にてタイトルバーへプログレスアイコンを表示可能にするよう

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

を追記し、

非同期(スレッド)処理を実行する前に

this.setProgressBarIndeterminateVisibility(true);

を実行すると、タイトルバーへプログレスアイコンが表示されます。

package technoute.site.com.google.sites.sample.thread;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.Window;

import android.view.View.OnClickListener;

import android.widget.TextView;

public class ActivityMain extends Activity implements OnClickListener {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// タイトルバーにプログレスアイコンを表示可能にする

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

// ActivityへViewをセット

setContentView(R.layout.main);

// 各ボタンのリスナーをセット

this.findViewById(R.id.button1).setOnClickListener(this);

}

/*

* ボタンクリック時の処理

*/

@Override

public void onClick(View v) {

//**********************************************************************

// "スレッド処理" ボタンの場合

//**********************************************************************

if (v.getId() == R.id.button1) {

// Activityに設置してあるTextViewを取得

TextView textView = (TextView)this.findViewById(R.id.textView);

// TextViewの文字列をセット

textView.setText("読み込み開始...");

// タイトルバーのプログレスアイコンを表示する

this.setProgressBarIndeterminateVisibility(true);

// 非同期(スレッド)クラスの生成

AsyncTaskProgressTitleThread thread = new AsyncTaskProgressTitleThread(this);

// 非同期(スレッド)処理の実行

thread.execute();

}

}

}

あとは非同期(スレッド)処理が終わったときにタイトルバーのプログレスアイコンを非表示にしてあげればよいので、

onPostExecute() と onCancelled() で処理終了時に

this.m_Activity.setProgressBarIndeterminateVisibility(false);

と記述してタイトルバーのプログレスアイコンを非表示にしてあげれば完了です。

package technoute.site.com.google.sites.sample.thread;

import android.app.Activity;

import android.os.AsyncTask;

import android.widget.TextView;

/*

* AsyncTask<型1, 型2,型3>

*

* 型1 … Activityから非同期(スレッド)処理へ渡したい変数の型

* ※ Activityから呼び出すexecute()の引数の型

* ※ doInBackground()の引数の型

*

* 型2 … 進捗度合を表示する時に利用したい型

* ※ onProgressUpdate()の引数の型

*

* 型3 … バックグラウンド処理完了時に受け取る型

* ※ doInBackground()の戻り値の型

* ※ onPostExecute()の引数の型

*

* ※ それぞれ不要な場合は、Voidを設定すれば良い

*/

public class AsyncTaskProgressTitleThread extends AsyncTask<Void, Void, String> {

private Activity m_Activity;

/*

* コンストラクタ

*

* @param activity: 読み出し元Activity

*/

public AsyncTaskProgressTitleThread(Activity activity) {

// 呼び出し元のアクティビティを変数へセット

this.m_Activity = activity;

}

/*

* バックグラウンドで実行する処理

*

* @param params: Activityから受け渡されるデータ

* @return onPostExecute()へ受け渡すデータ

*/

@Override

protected String doInBackground(Void... params) {

String ret = "";

try {

// Sleep処理(例:HTTP通信)

Thread.sleep(1000);

// Sleep処理(例:HTTP解析/画像変換とか)

Thread.sleep(1000);

// 取得してきた文字列・画像などをreturnでonPostExecuteへ渡す

ret = "読み込み完了!";

} catch (InterruptedException e) {

e.printStackTrace();

}

return ret;

}

/*

* メインスレッドで実行する処理

*

* @param param: doInBackground()から受け渡されるデータ

*/

@Override

protected void onPostExecute(String param) {

// 読み出し元Activityに設置してあるTextViewを取得

TextView textView = (TextView)this.m_Activity.findViewById(R.id.textView);

// TextViewの文字列をセット

textView.setText(param);

// タイトルバーのプログレスアイコンを非表示にする

this.m_Activity.setProgressBarIndeterminateVisibility(false);

return;

}

/*

* キャンセル時の処理

*/

@Override

protected void onCancelled() {

super.onCancelled();

// タイトルバーのプログレスアイコンを非表示にする

this.m_Activity.setProgressBarIndeterminateVisibility(false);

return;

}

}