2011-10-28 7 views
0

時間のかかる操作のためにアンドロイドでスレッドを作成しています。メイン画面に進行中のダイアログが表示され、その操作が進行中であることを知らせるメッセージが表示されますが、スレッドが完了するとそのダイアログを閉じるようにします。私は結合で試してみましたが、スレッドをロックしてダイアログを表示しません。私は使用しようとしました:スレッドが完了するとダイアログを閉じる

dialog.show(); 
mythread.start(); 
dialog.dismiss(); 

しかし、ダイアログが表示されません。どのようにしてそのシーケンスを作ることができますか?メインスレッドをロックせずにスレッドが終了するのを待ちますか?

これは限り私が得たようである:

public class syncDataElcanPos extends AsyncTask<String, Integer, Void> { 
    ProgressDialog pDialog; 
    Context cont; 
    public syncDataElcanPos(Context ctx) { 
     cont=ctx; 
    } 

    protected void onPreExecute() { 
    pDialog = ProgressDialog.show(cont,cont.getString(R.string.sync), cont.getString(R.string.sync_complete), true); 
} 

protected Void doInBackground(String... parts) {   
    // blablabla... 
    return null; 
} 

protected void onProgressUpdate(Integer... item) { 
    pDialog.setProgress(item[0]); // just for possible bar in a future. 
} 

protected void onPostExecute(Void unused) { 
    pDialog.dismiss(); 
} 

しかし、私はそれを実行しようとすると、それは私に例外を与える:「ウィンドウを追加できません」。あなたのスレッドが実行されると、あなたがここに

を解任呼び出すことができます上のpostexecuteでAsyncTaskでよく

答えて

1

そこにそれを行うには2つの方法が、あることを行うには(と私は第一、第二1を好む:AsyncTask):

まず:あなたはalertDialogを表示し、run()あなたがすべき方法についてこのようAsyncTaskを使用する:

この

@override 
public void run(){ 
//the code of your method run 
//.... 
. 
. 
. 
//at the end of your method run() , dismiss the dialog 
YourActivity.this.runOnUiThread(new Runnable() { 
public void run() { 
     dialog.dismiss(); 
    } 
}); 

} 

セカンド好きです

class AddTask extends AsyncTask<Void, Item, Void> { protected void onPreExecute() { //create and display your alert here pDialog = ProgressDialog.show(MyActivity.this,"Please wait...", "Downloading data ...", true); } protected Void doInBackground(Void... unused) { // here is the thread's work (what is on your method run() items = parser.getItems(); for (Item it : items) { publishProgress(it); } return(null); } protected void onProgressUpdate(Item... item) { adapter.add(item[0]); } protected void onPostExecute(Void unused) { //dismiss the alert here where the thread has finished his work pDialog.dismiss(); } } 
0

は、ダイアログを閉じrunOnUIThreadメソッドを使用し、他のスレッドから

class AddTask extends AsyncTask<Void, Item, Void> { 

    protected void onPreExecute() { 
     pDialog = ProgressDialog.show(MyActivity.this,"Please wait...", "Retrieving data ...", true); 
    } 

    protected Void doInBackground(Void... unused) { 
     items = parser.getItems(); 

     for (Item it : items) { 
      publishProgress(it); 
     } 
     return(null); 
    } 

    protected void onProgressUpdate(Item... item) { 
     adapter.add(item[0]); 
    } 

    protected void onPostExecute(Void unused) { 
     pDialog.dismiss(); 
    } 
    } 
+0

ありがとう、あなたの助けを借りて、AsyncTaskオプションを試し、それがどうなるかを見てみましょう... – MarioV

+0

進捗状況ダイアログでコンテキストを追加するにはどうしたらいいですか? MyActivity.thisは私のために働いていない、彼らはそれらのparamsで作成することはできません、それは活動そのものではなく、コンテキストを取っていると言います。 – MarioV

+0

クラスAddTaskをアクティビティのInnerClassとして宣言していますか?もしそうなら、それはうまくいくはずなので、クラスにコンテキストを渡す必要がありますAddTask – Houcine

3

例です。

runOnUiThread(new Runnable() { 
public void run() { 
     dialog.dismiss(); 
    } 
});