Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ProgressDialog运行时异常_Android_Multithreading_Progressdialog - Fatal编程技术网

Android ProgressDialog运行时异常

Android ProgressDialog运行时异常,android,multithreading,progressdialog,Android,Multithreading,Progressdialog,我在AsyncTask中显示ProgressDialog,如下所示 public class DataComm extends AsyncTask<String, Void, JSONObject> { ... ProgressDialog pd = null; ... protected void onPreExecute() { pd = ProgressDialog.show(activity, activity.getResources().getText(R.str

我在AsyncTask中显示ProgressDialog,如下所示

public class DataComm extends AsyncTask<String, Void, JSONObject> {
...
ProgressDialog pd = null;
...
protected void onPreExecute() {
    pd = ProgressDialog.show(activity, activity.getResources().getText(R.string.wait_please) + "\u2026", "", true);
    ...
protected void onPostExecute(JSONObject result) {

    super.onPostExecute(result);        
    ...
    pd.dismiss();
}
公共类数据通信扩展异步任务{
...
ProgressDialog pd=null;
...
受保护的void onPreExecute(){
pd=ProgressDialog.show(activity,activity.getResources().getText(R.string.wait_please)+“\u2026”,“true”);
...
受保护的void onPostExecute(JSONObject结果){
super.onPostExecute(结果);
...
pd.解散();
}
PD在实现AsyncTask的类中声明。我使用创建的活动的上下文在onPreExecute中初始化它,并尝试在doInbackground的末尾调用PD.disease()。这是从多个活动中调用的,在某些活动中它可以工作,但在其他活动中我得到RuntimeException“向死线程上的处理程序发送消息”。 在失败的情况下,我知道我用来创建PD的活动仍然存在,所以我不知道是什么线程死了


有问题的调用来自一个基类,该基类用于更新从ArrayAdapter派生的类的列表。AsyncTask是在ArrayAdapter需要填充选项列表时调用的。这是否发生在UI主线程以外的某个线程上。我仍然不明白为什么它会在调用onPostExecute之前消亡ed.

异步任务doInbackground方法在后台以独立线程(主线程除外)运行。请检查这可能是由于某种原因导致的。我认为您应该首先为AsyncTaskDataComm创建构造函数,然后在构造函数中初始化您的
ProgressDialog
,如下所示:

public class DataComm extends AsyncTask<String, Void, JSONObject> {
...
ProgressDialog pd;
...

public void DataComm(Context mContext)
{
  pd = new ProgressDialog(mContext);

}
protected void onPreExecute() {
    this.pd.setMessage(mContext.getResources().getText(R.string.wait_please) + "\u2026");
    this.pd.show();
    ...
}
protected void onPostExecute(JSONObject result) {

    super.onPostExecute(result);        
    ...
    if (pd.isShowing()) {
        pd.dismiss();
    }
}
公共类数据通信扩展异步任务{
...
进展性帕金森病;
...
公共无效数据通信(上下文mContext)
{
pd=新建进度对话框(mContext);
}
受保护的void onPreExecute(){
this.pd.setMessage(mContext.getResources().getText(R.string.wait_please)+“\u2026”);
this.pd.show();
...
}
受保护的void onPostExecute(JSONObject结果){
super.onPostExecute(结果);
...
if(pd.isShowing()){
pd.解散();
}
}
试试这个:

public class DataComm extends AsyncTask<String, Void, Void> {

    ProgressDialog pd = null;

    protected void onPreExecute() {
       pd = ProgressDialog.show(activity, activity.getResources().getText(R.string.wait_please) + "\u2026", "", true);
    }
    protected void onProgressUpdate(Integer... progress) {
         pd.setProgress(progress[0]);
     }
    protected void onPostExecute() {
      super.onPostExecute(result);        
      ...
      activity.runOnUiThread(new Runnable() {
          @Override
          public void run(){
           if (pd.isShowing()) {
               pd.dismiss();
            }
          }
       });            
    }
}
公共类数据通信扩展异步任务{
ProgressDialog pd=null;
受保护的void onPreExecute(){
pd=ProgressDialog.show(activity,activity.getResources().getText(R.string.wait_please)+“\u2026”,“true”);
}
受保护的void onProgressUpdate(整数…进度){
pd.setProgress(progress[0]);
}
受保护的void onPostExecute(){
super.onPostExecute(结果);
...
activity.runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
if(pd.isShowing()){
pd.解散();
}
}
});            
}
}

ArrayAdapter支持似乎是问题所在。从UpdateMap覆盖更新列表似乎是在一个单独的线程上进行的。当我将调用放入runOnUiThread中时,不再有死线程:

activity.runOnUiThread(new Runnable() {

        @Override
        public void run() {
            DataComm dc = new DataComm(itemFetcher, activity, pd);
            dc.execute("main", "product_search","search_prefix", newFilter);
        }
    });

RuntimeException通常意味着另一个异常,请发布您的Logcat@ItzikSamaraRuntimeException的原因是“向死线程上的处理程序发送消息”。在AsyncTask外部创建PD