2012-03-06 63 views
0

我想顯示等待的對話框,但它根本不顯示,這很奇怪,因爲需要花費很多時間的事情是setData()函數,我得到一個json飼料,我將它們保存在數據庫中(需要3/5秒)。Android,等待對話框根本沒有顯示

這裏是我的代碼:

ProgressDialog dialog = ProgressDialog.show(TabLayoutActivity.this, "", "Loading. Please wait...", true); 

    //refresh the view 
    taskLiteApplication.setData(); 

    //change view 
    Intent myIntent = new Intent(TabLayoutActivity.this, TabLayoutActivity.class); 
    TabLayoutActivity.this.startActivity(myIntent); 

    //kill the dialog waiting 
    dialog.cancel(); 

回答

2

我打賭的問題是,你正在做的所有UI線程上這項工作,於是你開始的那一刻對話框,啓動線程和顯示當您執行setData()工作時窗口實際上正在凍結。您應該將setData函數移動到後臺線程或AsyncTask,以便在後臺執行繁重的工作時,UI線程可以繼續。

private ProgressDialog dialog; 

void doStuff() 
{ 
    dialog = ProgressDialog.show(TabLayoutActivity.this, "", "Loading. Please wait...", true); 
    HeavyTask task = new HeavyTask(); 
    task.execute(); 
} 

private class HeavyTask extends AsyncTask<Void, Void, Void> { 
    protected Void doInBackground(Void... args) { 
     //refresh the view 
     taskLiteApplication.setData(); 
     return; 
    } 

    protected void onPostExecute(Void results) { 
     //change view 
     Intent myIntent = new Intent(TabLayoutActivity.this, TabLayoutActivity.class); 
     TabLayoutActivity.this.startActivity(myIntent); 

     //kill the dialog waiting 
     dialog.dismiss(); 
     dialog = null; 
    } 
} 
+0

是的,它可能是我在想,啓動對話框之前,將被罰款,但肯定的, – 2012-03-06 21:29:09

+0

我會盡力做到這一點在隨後的AsyncTask我會讓你更新謝謝你的回答 – 2012-03-06 21:29:40

+0

工作中,你只是錯過了doInBackground函數的返回值,謝謝! – 2012-03-06 22:55:12

0

我在猜測taskLiteApplication.setData();在UI線程中運行,而不是在後臺線程中運行,或者在後臺線程中運行,並且因爲取消了UI線程中的取消操作而被調用。

基本線索,以解決您的問題:

private ProgressDialog dialog; // Keep this global 
private Handler mHandler; 

void doStuff() { 
    dialog = ProgressDialog.show(TabLayoutActivity.this, "", "Loading. Please wait...", true); 
    mHandler = new Handler() 
    { 
     @Override public void handleMessage(Message msg) { 
      if (msg.obj != null) { 
       dialog.dismiss(); 
       //change view 
       Intent myIntent = new Intent(TabLayoutActivity.this, TabLayoutActivity.class); 
       TabLayoutActivity.this.startActivity(myIntent); 
      } 
     } 
    }; 
    //refresh the view 
    Thread t = new Thread(new Runnable() { 
     @Override public void run() { 
      // Assuming setData does NOT run on it's own background thread 
      taskLiteApplication.setData(); 
      Message message = Message.obtain(); 
      message.obj = "DONERAEREAR"; 
      mHandler.sendMessage(message); 
     } 
    })}; 
    t.start(); 
} 

編輯增加了一個處理程序,由Wizetux指出需要在對話框中的UI線程被取消

這樣做的好處是你可以發送處理程序錯誤消息,警告消息,成功消息並進行相應處理。

E.G.

message.obj = "ERROR"; 
mHandler.sendMessage(message); 
在處理

然後

if ((String)msg.obj.equals("ERROR")) { /* Handle Error */ } 
+0

您無法從後臺線程調用dialog.cancel。它必須從UI線程完成。這不會按原樣工作。 – Wizetux 2012-03-06 21:06:13

+0

用處理程序編輯 – bbedward 2012-03-06 21:34:58