2012-06-14 14 views
1

因此,我使用此代碼在數據庫設置了函數「setUpDB」時顯示消息「正在安裝...」,然後在數據庫函數完成時刪除。這薑餅和蜂窩工作正常,但會導致應用程序在ICS預加載progressDialog使得我的應用程序僅在ICS中崩潰

 final ProgressDialog pd=ProgressDialog.show(this,"","Installing..."); 

    final Handler handler = new Handler() 
    { 
     public void handleMessage(Message msg) 
     { 
      if(msg.what==0) 
      { 
       pd.dismiss(); 
      } 
     } 
    }; 


    //have subcategory heading??? 
    Thread thread = new Thread() 
    { 
     @Override 
     public void run() { 
     setUpDB(); 
     handler.sendEmptyMessage(0); 
     } 
    }; 
    thread.start(); 

崩潰沒有解僱的消息,應用程序將繼續運行I​​CS(但你不能做任何事情),並且不顯示消息,如果用戶沒有做任何事情它完成正在設置就會死機(因此爲什麼我需要安裝消息)之前訪問數據庫..

好了,這是一個使用的AsyncTask

final ProgressDialog pd=ProgressDialog.show(this,"","Installing..."); 
    final Handler handler = new Handler() 
    { 
     public void handleMessage(Message msg) 
     { 
      if(msg.what==0) 
      { 
       pd.dismiss(); 
      } 
     } 
    }; 
    new databaseInstallTask().execute(handler); 

代碼,

private class databaseInstallTask extends AsyncTask<Handler, Void, Handler> 
{  
     @Override 
     protected Handler doInBackground(Handler... params) { 
      setUpDB(); 
      return params[0]; 
     } 

    protected void onPostExecute(Handler handler) { 
     handler.sendEmptyMessage(0); 
    } 
} 
+0

你的代碼非常好!它應該工作!!告訴我們你的崩潰日誌 –

+0

它在ICS之前的任何工作都很好。也許Handler破壞了Android線程的第二條規則? 1)不要屏蔽UI線程 2)不要從UI線程之外訪問Android UI工具包 – Chimeara

回答

2

你爲什麼不嘗試使用Asynctask,我認爲這是處理你的情況最合適的方法。

+0

好吧我有一個AsyncTask正在自己的工作,但將與今晚的其他代碼一起檢查它(往上看)。有沒有更好的方式讓Handler進入onPostExecute而不通過doInbackground? – Chimeara

相關問題