非同期(スレッド)処理中にタイトルバーへプログレスアイコンを表示する
非同期(スレッド)処理中だということは、
ユーザに分かるようにしておいたほうが親切ですので、
タイトルバーへプログレスアイコンを表示する方法を記載します。
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;
}
}