2011年7月25日月曜日

あえてProgressDialogを使いまわす

間違っている気がしないでもない、ProgressDialog使い回し方法
たぶんProgressDialog以外でも使えるけど、その場合どうなるかは未検証

というよりも基本は

  • ProgressDialog生成
  • show
  • dismiss
を必要に応じて繰り返すでいいと思うんですが…

なんかこう毎度毎度ProgressDialogを生成するのがねぇ…

そして不思議とググッても(日本語では)この方法しかTOPに出てこないし。


ちなみに以下のようにすると、処理中を示すあのグルグル回るアニメーションが二回目以降動かないです。

/**
 * ところどころ脳内補完必須
 */
public class TestActivity extends Activity {

 private ProgressDialog   mProgressDialog    = null;
 
 public void onCreate( Bundle savedInstanceState) {

  mProgressDialog = new ProgressDialog( this);
  mProgressDialog.setProgressStyle( ProgressDialog.STYLE_SPINNER);
  mProgressDialog.setMessage( "Now processing...");
  mProgressDialog.setCancelable( false);
 }
 
 
 /**
  * ボタン押した時とかの処理
  */
 public void onClickTest( View view){
  
  Thread th = new Thread() {

   @Override
   public void run() {

    // TODO 適当に時間のかかる処理
    
    mProgressDialog.dismiss();
    
    return;
   }

  };

  th.start();
  
  mProgressDialog.show(); //2回目以降はグルグルアニメーションがされない!
  
 }

これを以下のようにすると二回目以降もグルグル回る

 /**
  * ボタン押した時とかの処理
  */
 public void onClickTest( View view){
  
  Thread th = new Thread() {

   @Override
   public void run() {

    // TODO 適当に時間のかかる処理
    
    mProgressDialog.hide();
    
    return;
   }

  };

  th.start();
  
  mProgressDialog.show();
  
 }

ただし developersの dismisshide をみると(恐らく)こう書いてあります。

  • dismiss:スクリーンから削除するよ。(たぶん)終了時の処理をなんか足したい場合にオーバーライドするならdismissじゃなくてonStop()側でやってね☆(ゝω・)vキャピ
  • hide:表示は消えるけど、これdismissじゃねーから

とまあ、恐らくProgressDialog側(Progress以外のダイアログもたぶん)はThreadっぽい実装を確実にしているっぽい。
いや、ソース見てない(追いかけるのメンドイ)から知らんけど。
でもOnStartとかOnStopとかそれっぽいし、恐らくdismissは内部のThread終了処理も含んでいるんでしょう。
一方でhideはホント表面上消しているだけっぽい。てか説明がそれだけだし…。

まあ、何が言いたいかというと上のソースもそういう意味で間違い。
きっと正しく修正するとこんな感じ

/**
 * ところどころ脳内補完必須
 */
public class TestActivity extends Activity {

 private ProgressDialog   mProgressDialog    = null;
 
 public void onResume() {

  mProgressDialog = new ProgressDialog( this);
  mProgressDialog.setProgressStyle( ProgressDialog.STYLE_SPINNER);
  mProgressDialog.setMessage( "Now processing...");
  mProgressDialog.setCancelable( false);
  
  super.onResume();
 }
 
 public void onPause() {

  mProgressDialog.dismiss();
  mProgressDialog = null;
  super.onPause();
 }
 
 /**
  * ボタン押した時とかの処理
  */
 public void onClickTest( View view){
  
   Thread th = new Thread() {

   @Override
   public void run() {

    // TODO 適当に時間のかかる処理
    
    mProgressDialog.hide();
    
    return;
   }

  };

  th.start();
  
  mProgressDialog.show();
  
 }
}

何れにしてもdismiss呼んでおけば終了処理は行われるんだろうと脳内解釈するとこれで正しいと思います

まあこういう書き方をするメリットは…?と聞かれると「さぁ…」としか答えられませんが…

でもhideが非推奨メソッドでも無く、呼び出せるようになっているという以上、間違いではないはず。

インスタンスを再生成しないぶん、もしかしたらメモリ的に有利かもしれないけど…
ダイアログ一個でそんなに変わるとは思えないです…(計測すればイイんだけど)
むしろ背面でもグルグル処理やっていたらCPU食っているかもしれない(それもたかが知れているはずですが)

あとは、

  • 時間のかかる処理
  • 一旦ユーザーに何か処理を行わせるためにhide
  • 時間のかかる処理再開
  • 一旦ユーザーに何か処…
とかの場合でしょうか??なんか良い使い方が思いつかん。

で、本当の所どうなんだろう。サンプルでhideを見かけない(ような気がする)理由は。
教えて偉い人♪

0 件のコメント:

コメントを投稿