2011-08-15 13 views
0

スレッドを使用しているため、アプリでデータが読み込まれている間に進行状況ダイアログが表示されます。エラーが発生した場合は、進行状況ダイアログが停止し、「エラー」というポップアップが表示されます。しかし、私は、警告ダイアログがUIスレッド内で実行できず、ハンドラを使用する必要があることを知りました。この問題に助けを借りている人はいますか?ここに私のコードです。ありがとうアラートダイアログがスレッド内で動作しないのはなぜですか?

verifyCode.setOnClickListener(new OnClickListener() { 

@Override 
public void onClick(View arg0) { 
    // TODO Auto-generated method stub 
    final ProgressDialog progressDialog = ProgressDialog.show(
      Activate.this, "", "Loading...");  

    new Thread(new Runnable() { 
     public void run() { 
       try { 
        new AlertDialog.Builder(Activate.this) 
        .setTitle(getResources().getString(R.string.InvalidKey)) 
        .setMessage(getResources().getString(
        R.string.PleaseEntervalidRegistration)).setNeutralButton(
        "OK", null).show(); 

        progressDialog.dismiss(); 

        //more code 
    }).start(); 
} 
+1

私はなぜ新しいスレッドが必要なのか尋ねることはできますか?それは実行全体が同期しているように見えるからです。また、ベストプラクティスとして、スレッドを直接処理しないようにしてください。 Androidには非同期実行を処理するAsyncTaskというクラスがあります。 –

+0

私がスレッドに入れている理由は、進捗ダイアログを追加したいからです。私が見たすべての例では、スレッド内で進捗ダイアログが終了しています。 – Sean

答えて

3

UI以外のスレッドでUI要素を変更することはできません。 onClickはUIスレッド上で実行されますが、ThreadonClickにスポーンするので、UI以外の要素はその内部から操作できませんThread。新しいThreadを生成する直前に、AlertDialogProgressDialogの呼び出しを移動してください。

また、@ lightbladeが示唆しているように、その処理に基づいて重いバックグラウンド処理とUI操作を必要とする何らかのアクションを実行する必要がある場合は、AsyncTaskを使用してください。前処理、実際の処理、後処理、および進行状況の更新のためにオーバーライドできるメソッドを提供します。

+0

スレッドを使用せずに進捗ダイアログを呼び出そうとしましたが、進捗ダイアログが表示されませんでした。私は少しAsyncTaskを使用する方法について混乱しています。あなたが私のコードのいくつかを修正して、これが正しく動作するために何を置き換える必要があるかを知ることができますか?ありがとう – Sean

関連する問題