2011-01-25 6 views
0

私は愛もお金に表示することができませんでしたProgressDialogを持っています。私はそれをスレッドに入れる必要があることを示唆している。アンドロイド - ProgressDialogsとスレッド

ですから、例えば

public void Update(final int ScheduleId, final Context context) { 
    final Handler progressHandler = new Handler() { 
     public void handleMessage(Message msg) { 
      x.dismiss(); 
     } 
    };   

     x = ProgressDialog.show(context, "Scheduling...", "Calculating and Storing Dates", true, false);   
    new Thread() { 
     public void run() { 
      // Do Nothing 
      boolean bResult = UpdateHistory(ScheduleId, context); 
      Log.i("HERE","Finished Here?"); 
      if (bResult) { 
       progressHandler.sendEmptyMessage(0); 
      } 
     } 
    }.start(); 
} 

しかし、私のために起こるようですそのすべてが、UpdateHistoryはバックグラウンドで実行し続けながら、スピナーだけで画面をオフに消え、活動が終了していることです。

私は.start以下UpdateHistory()の呼び出し(スレッドの外)を移動した場合、私はすべてに表示進捗スピナーを得ることはありません。

正確にはイム不足していることは何ですか?

すべてこのコードは活動です。

何がお勧めできますか?ほとんどのウェブサイトはスレッドについて話すように見えますが、できる限りの方法で試してみました。私の言うように、スレッドはバックグラウンドで実行され、スピナーは関数がフォアグラウンドで実行されている間は、スピンナーをまったく取得しません。

おかげ サイモン

+2

非同期タスクを使用してみてください、それがなければなりませんこれには完璧です。 – Jems

答えて

1

が好ましい方法はAsyncTaskであるが、あなたはまた、Threadでそれを行うことができる必要があり、このような何か:

public class MyActivity extends Activity { 
    ... 
    private static final HANDLER_MESSAGE_SUCCESS = 0; 
    private ProgressDialog x; 
    ... 
    private Handler handler = new Handler(){ 
     @Override 
     public void handleMessage(Message msg) { 
      switch(msg.what){ 
      case HANDLER_MESSAGE_SUCCESS: 
       x.dismiss(); 
      default: 
       Log.w("Handler","handleMessage/Message type not recognised/msg.what = "+String.valueOf(msg.what)); 
      } 
     } 
    }; 
    private void backgroundProcess(){ 
     x = ProgressDialog.show(MyActivity.this, "Scheduling...", "Calculating and Storing Dates", true, false); 
     Thread backgroundThread = new Thread() { 
      @Override 
      public void run() { 
       boolean bResult = UpdateHistory(ScheduleId, MyActivity.this); 
       Log.i("HERE","Finished Here?"); 
       if (bResult) { 
        Message msg = Message.obtain(); 
        msg.what = HANDLER_MESSAGE_SUCCESS; 
        handler.sendMessage(msg); 
       } 
      } 
     }; 
     backgroundThread.start(); 
    } 
} 
+0

提案していただきありがとうございます。私はおそらく私が@Overrideを逃したことを望んでいた - それはばかげていただろう。しかし、いいえ、これでも、同じこと。ダイアログが1秒間表示されたら、それが消え、UpdateHistory関数がバックグラウンドで実行されますが、最終的に戻ってLog.iを実行します。明らかにバックグラウンドで実行されているスレッド(私はスレッディングが嫌い - VB6はいつでも)。 「E /ウィンドウマネージャ(444):ウィンドウ[email protected]を漏洩したcom.whatever.whatever活動が最初にここに添加したことを」私はこのかかわら得るか – Simon

+0

を私は持っています非同期タスクを調べます。しかし、誰もがなぜこれが動作しない理由を説明することができますそこにすべてのウェブサイトがそれを示唆するように思われる?実際にスレッド、非同期、またはProgressDialogを呼び出すためのものを選択する理由を教えてください。 – Simon

+0

hmm、変数 'context'を渡していることに気がつきました。これはどのように初期化されますか?それを 'MyActivity.this'と置き換えてみてください。 –

関連する問題