で。
これの使い道っていうと、重い処理を別スレッドで動かして、その間に表示。
処理が終了したら閉じる。 ってなる。
なので、重い処理の開始前にshow()して、処理が終わったらdismiss()を呼ぶ。
でも、その「重い処理」ってーのは、別スレッドなので、別スレッドからshow()すると、RuntimeExceptionだしてくれるんだよね。コイツ。(Toastでも同じ現象発生)
んで、Handlerを使えとかなんとか言われるわけなんだけど。
なんとかクラスでまとめられないかなーと思って、作ってみました。
package mosaic.dividebyzero.net;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Handler;
class MyProgressDialog implements Runnable {
private String title, message;
private static ProgressDialog progressDialog;
private static Handler handle = new Handler();
public static void init(Context context) {
if (progressDialog == null) progressDialog = new ProgressDialog(context);
}
public static void createDialog(String title, String message) {
if (progressDialog == null)
throw new RuntimeException("MyProgressDialog is not initialize\nplease call init Method.");
handle.post(new MyProgressDialog(title, message));
}
public static void close() {
if (progressDialog != null) progressDialog.dismiss();
}
public MyProgressDialog(String title, String message) {
this.title = title;
this.message = message;
}
@Override
public void run() {
// TODO 自動生成されたメソッド・スタブ
progressDialog.setTitle(title);
progressDialog.setMessage(message);
progressDialog.setIndeterminate(false);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setCancelable(true);
progressDialog.show();
}
}
肝は、createDialogより前にinitを呼ぶということ。
さらに言えば、initはviewのスレッドから呼ぶ必要があるっぽいです(てか、無きゃinitとcreateに分ける必要が無い)
正直、ここらへんは行き当たりばったりというか、やってみたら出来た。というか。
理論に基づいた作りじゃないのでなにか間違ってるかもですが。とりあえず、今のところ問題無しです。
0 件のコメント:
コメントを投稿