2013-07-18 111 views
1

我有一個從數據庫中提取數據並將其填充到列表的過程。我希望在執行查詢時顯示進度對話框,但只有在執行查詢後纔會顯示。我相信我必須在一個單獨的線程中運行ProgressDialog,但接下來有幾條建議並且無法使其工作。ProgressDialog在一個單獨的線程

所以在我Activity我只是

private void DisplayAllproductListView(String SqlStatement) {   
    ProgressDialog dialog = 
    ProgressDialog.show(MyActivity.context, "Loading", "Please wait...", true); 
    //.................. 
    //.................. 
    //execute sql query here 
    dialog.dismiss(); 
    } 

感謝

+3

sepearate thread !.在'onPreExecute'中使用asynctask顯示進度對話框並在'onPostExecute'中關閉它。 – Raghunandan

+0

嘗試使用AsyncTask – Joel

回答

10

1.show您處理dialo克主線程

2.啓動一個新的線程(如線程A)處理您的沉重工作

3.當完成後,使用處理器從線程A將消息發送到主線程,後者駁回進程對話框

這樣的代碼 private ProcessDialog pd;

private void startDialog() 
{ 

pd = ProgressDialog.show(MainActivity.this, "title", "loading"); 

    //start a new thread to process job 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      //heavy job here 
      //send message to main thread 
      handler.sendEmptyMessage(0); 
      } 
     }).start(); 
} 

Handler handler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     pd.dismiss(); 
    } 
}; 
+0

非常感謝您的解決方案。我認爲這是完美的工作,除了它爲我崩潰。問題是我的「繁重工作」包括查詢,自定義數據適配器和映射到列表視圖。你認爲這可能是問題?我應該只是在一個新的步伐查詢? – Alex

+0

你可以在線程中做任何事情。 – kvh

+0

並記住,您只能在主線程中處理ui。 – kvh

3

嘗試是這樣的:

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

    private ProgressDialog mProgress; 

    @Override 
    protected void onPreExecute() { 
     //Create progress dialog here and show it 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 

     // Execute query here 

     return null; 

    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 

     //update your listView adapter here 
     //Dismiss your dialog 

    } 

} 

要叫它:

new MyAwesomeAsyncTask().execute(); 
+0

非常感謝您的解決方案。我認爲這是完美的工作,除了它爲我崩潰。問題是我的「繁重工作」包括查詢,自定義數據適配器和映射到列表視圖。你認爲這可能是問題?我應該只在異步任務中查詢嗎? – Alex

+0

嘗試將適配器和listview更新的代碼放在onPostExecute方法中。你不能操作doInBackground方法中的UI線程,因爲它在後臺運行:) –

+0

再次感謝。自定義列表的查詢和準備工作在doInBackground中是最好的。我怎麼能將一個對象CustomListDataAdaptor從doInBackground傳遞給onPostExecute?語法是什麼?感謝百萬 – Alex

0

所有你需要做的,就是告訴安卓的主UI線程上運行它。無需創建處理程序。

runOnUiThread(new Runnable() { 
    public void run() { 
     progressDialog.dismiss(); 
    } 
}); 
相關問題