2012-06-14 13 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

相关问题