2016-08-09 112 views
-1

在我的應用程序中,我使用ProgressDialog向用戶顯示某些服務正在運行。我在我的活動中啓動ProgressDialog,但顯示不正確。它不是馬上開始的。就在服務大部分完成時,它會彈出一毫秒並再次解散。Android ProgressDialog無法正確顯示

它是如何工作的:

在我的活動中,我有一個按鈕。點擊按鈕時,我啓動ProgressDialog併爲該服務調用調用AsyncTask。當AsyncTask完成時,它將結果廣播(!)回活動。 AsyncTask沒有直接訪問活動。整個過程很順利。但不是ProgressDialog。

ProgressDialog變量是一個類成員。

+2

您需要在您的問題中包含代碼,以便我們能夠理解實際發生的情況 – Max

+0

如果'OnPreExecute'中調用'ProgressDialog.show()',那麼您肯定會在'AsyncTask'上運行一些阻塞代碼。僅僅因爲你使用'AsyncTask'並不意味着所有的代碼都在後臺運行 – SoroushA

回答

0

這些都是4個步驟的AsyncTask,您應該使用的第一個onPreExecute(),最後一個onPostExecute(Result),顯示和解散你的ProgressDialog

當執行異步任務,任務經過4個步驟:

1.- onPreExecute(),在任務執行前在UI線程上調用。此步驟通常用於設置任務,例如 ,方法是在用戶界面中顯示進度條。

2.- doInBackground(Params ...),在onPreExecute()完成執行後立即在後臺線程上調用。使用此步驟 執行可能需要很長時間的後臺計算。異步任務的參數 傳遞到此步驟。計算結果 必須由此步驟返回,並且將返回到最後一步 。此步驟還可以使用 publishProgress(Progress ...)發佈一個或多個進度單元。 這些值發佈在UI線程的 onProgressUpdate(Progress ...)步驟中。

3.- onProgressUpdate(Progress ...),在調用publishProgress(Progress ...)後在UI線程上調用。執行時間爲 未定義。在後臺計算仍在執行時,此方法用於在用戶界面中顯示任何形式的進度。例如,它可以用來爲進度條設置動畫效果,或者在 文本字段中顯示日誌。

4.- onPostExecute(Result),在後臺計算完成後在UI線程上調用。計算的背景 的結果作爲參數傳遞給此步驟。

信息來源:https://developer.android.com/reference/android/os/AsyncTask.html

+0

我在我的activity中調用了ProgressDialog.show()和ProgressDialog.dismiss()。所以它在主線程中。 AsyncTask的doInBackground()方法沒有處理。在我的活動中調用show()或在onPreExecute()方法中調用show()有什麼區別? –

+0

AsyncTask是一個類,它允許執行後臺操作並在UI線程上發佈結果,而無需操縱線程和/或處理程序。因此,使用onPreExecute()來初始化此類並在UI線程中開始後臺操作之前執行所有操作,最後使用onPostExecute()執行主線程中的所有人員。 –

0

您的活動創建的AsyncTask對象,並調用execute()方法。 CustomAsyncTask是內部類。

ProgressDialog mProgressDialog; mProgressDialog = new ProgressDialog(PlayerView.this); CustomAsyncTask asyncTask = new CustomAsyncTask(); asyncTask.execute();

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


    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

      mProgressDialog.setMessage("Loading"); 
      mProgressDialog.setTitle("please wait"); 
      mProgressDialog.show(); 

    } 

    @Override 
    protected ArrayList<PlayerViewModel> doInBackground(Void... params) { 
     return //do yout doInBackground work here 
    } 

    @Override 
    protected void onPostExecute(Void void) { 
     //when your process completed hide the ProgressDialog 
     mProgressDialog.hide(); 
    } 
} 

你要做的是,開始在onPreExecute()方法的進度對話框並隱藏progressDialog在onPostExecute方法,因爲這兩種方法都在主Thred工作。