2012-11-07 16 views
1

我有我在的AsyncTask進度對話框的應用問題,在第1次所示的對話框: 我AsyncTask從互聯網做一些葛亭數據doInBackGround(),我開始取得進展對話框onPreExecute(),完成對話框onPostExecute()安卓:進展不是(使用線程或的AsyncTask的longDuration操作)

我點擊按鈕時執行這個asyncTask。第一次當我點擊此按鈕(長時間操作發生時),進度對話框不顯示。但下次進度對話框顯示正常。

第一次運行AsyncTask,進度對話框不顯示,可能是什麼問題?

這是OnClick方法:

public void onClickFind(View view){ 
new Task_Search().execute(); 
} 

這是任務Task_Search

private class Task_Search extends AsyncTask<Void, Void, Void> { 

@SuppressWarnings("deprecation") 
protected void onPreExecute() { 
    showDialog(DIALOG_TASKING); 
} 

protected Void doInBackground(Void... unused) { 
    //some geting of web content here 
} 

@SuppressWarnings("deprecation") 
protected void onPostExecute(Void unused) { 
    dismissDialog(DIALOG_TASKING); 
} 
} 

進度對話框中MainActivity定義:

@SuppressWarnings("deprecation") 
@Override 
protected Dialog onCreateDialog(int id) { 
switch (id) { 
case DIALOG_TASKING: 
    mSearchDialog = new ProgressDialog(this); 
    mSearchDialog.setMessage("Searching for field number.."); 
    mSearchDialog.setCancelable(true); 
    return mSearchDialog; 
    } 
return super.onCreateDialog(id); 
} 

使用AsyncTask之前我用單獨的線程來下載數據:在onClick,我先開始progressDialog然後線程,當線程結束時progressDialog被採樣, 行爲是一樣的: 第一次點擊按鈕對話框沒有顯示,下次顯示它。

任何人都可以幫忙嗎?

回答

0

我不能看到你在對話框中調用show()。

更換

@SuppressWarnings("deprecation") 
protected void onPreExecute() { 
    showDialog(DIALOG_TASKING); 
} 

@SuppressWarnings("deprecation") 
protected void onPreExecute() { 
    showDialog(DIALOG_TASKING).show(); 
} 
+0

的ShowDialog(INT)返回void,所以這是不可能的。 – VinceFR

+0

是的,我誤以爲用戶定義的方法。我建議不要在任何情況下使用showDialog,但創建自己的ProgressDialog並顯示它。 – PravinCG

+0

我同意,我也推薦它! – VinceFR

0

不要調用的ShowDialog insode onPreExecute()。 AsyncTask提供了可以從doInBackground()調用的publishProgress()方法在UI線程上發佈更新。

+0

'onPreExecute()'也在UI線程上運行,併爲此提供了其他原因。 – Geobits

+0

我從來沒有說過它不會在UI線程上運行。很顯然,他希望在對話框中顯示由doInBackground()完成的進度。 onPreExecute在doInBackground之前運行,那麼他怎麼能在那裏顯示Dialog。 在理解問題和答案之前請不要downvote –

+1

顯示onPreExecute中的ProgressDialog不需要doInBackground中的任何信息。更新進度本身的確如此,但這與它展示無關。大多數AsyncTask/ProgressDialog示例都是這樣做的,甚至Google都會推薦它。閱讀[這裏](http://developer.android.com/reference/android/os/AsyncTask.html),在** 4步**下。 – Geobits

0

好吧,我 在MainActivity創造了我自己的方法:

public void showProgressDialog() { 
if (mProgressDialog == null) { 
    mProgressDialog = new ProgressDialog(this); 
    mProgressDialog.setMessage("Searching for field number.."); 
    mProgressDialog.show(); 
    return; 
}else{ 
    mProgressDialog.setMessage("Searching for field number.."); 
    mProgressDialog.show(); 
    return; 
} 

}

也:

public void closeProgressDialog() { 
if (mProgressDialog != null) { 
    mProgressDialog.dismiss(); 
} 
return; 
} 

我改的AsyncTask如下:

private class Task_Search extends AsyncTask<Void, Void, Void> { 
protected void onPreExecute() { 
    // showDialog(DIALOG_TASKING); 
    showProgressDialog(); 
} 

protected Void doInBackground(Void... unused) { 
//Some long duration stuff here 
} 

protected void onPostExecute(Void unused) { 
    //dismissDialog(DIALOG_TASKING); 
    closeProgressDialog(); 
} 
} 

mProgressDialog是MainActivity

的私有成員
private ProgressDialog mProgressDialog; 

情況是一樣的:wheck的onClick按鈕:第一次ProgressDialog卡,今後一段時期它的作品完美

+0

你卡住了什麼意思?它不顯示不確定的旋轉? – PravinCG

+0

它在初次使用操作時不顯示(當點擊按鈕操作發生時+旋轉進程對話框應該發生),它顯示下一次.. –

+0

我還沒有發現什麼可能是問題,我測試它也是真實的HW,HTC Sensation和Samsung Galaxy Pad 2,以及與AVD類似的產品 –