Android 预加载progressDialog使我的应用程序仅在ICS中崩溃

Android 预加载progressDialog使我的应用程序仅在ICS中崩溃,android,crash,android-4.0-ice-cream-sandwich,preload,Android,Crash,Android 4.0 Ice Cream Sandwich,Preload,因此,我使用此代码显示消息“Installing…”,同时使用函数“setUpDB”设置数据库,然后在数据库函数完成后删除。这在姜饼和蜂窝中工作良好,但在集成电路中会导致应用程序崩溃 final ProgressDialog pd=ProgressDialog.show(this,"","Installing..."); final Handler handler = new Handler() { public void handleMessa

因此,我使用此代码显示消息“Installing…”,同时使用函数“setUpDB”设置数据库,然后在数据库函数完成后删除。这在姜饼和蜂窝中工作良好,但在集成电路中会导致应用程序崩溃

        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();
在不关闭该消息的情况下,该应用程序将继续在ICS中运行(但您无法执行任何操作),并且如果用户在完成安装之前访问数据库,则该应用程序将崩溃(因此我需要安装消息)

好的,下面是使用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);

私有类数据库InstallTask扩展了AsyncTask
{       
@凌驾
受保护的处理程序doInBackground(处理程序…参数){
setUpDB();
返回参数[0];
}
受保护的void onPostExecute(处理程序){
handler.sendEmptyMessage(0);
}
}

为什么不尝试使用
异步任务
,我认为这是处理您的案例最合适的方法。

您的代码非常好!!它应该有用!!让我们看看你的碰撞日志在ICS之前任何情况下都能正常工作。也许Handler正在打破Android线程的第二条规则?1) 不要阻止UI线程2)不要从UI线程外部访问Android UI toolkit好的,我自己有一个AsyncTask,但今晚将与其余代码一起检查(见上文)。有没有更好的方法让处理程序在不经过doInbackground的情况下执行onPostExecute?
    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);
    }
}