"Can't create handler inside thread that has not called Looper.prepare()" 在异步任务中



我在一个android活动中遇到了一个奇怪的问题:我重新使用了以前的一个活动,它运行得很好,但这次我得到的只是"无法在未调用Looper.prepare()的线程内创建处理程序"

我试着调试,异步任务中的一切都执行得很好,但当我到达onPostExecute()的末尾时,就会引发错误。

所以我试着禁用进程对话框中的进程,唯一的变化是它在上一行崩溃了。

这是代码:

public class DateActivity extends ActionBarActivity{
    ProgressDialog mProgressDialog;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_date);
        ActionBar actionBar = this.getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setTitle(getResources().getString(R.string.actionbar_titre_date));
        if (VerifConnexion.isOnline(this)) {

            this.mProgressDialog = ProgressDialog.show(this, getResources().getString(R.string.loading),
                    getResources().getString(R.string.loading), true);
            new QueryForDateTask().execute(this.mProgressDialog, this, this.getApplicationContext());
        } else {
            ...
                }
            });
            alertDialog.show();
        }
    }

    private class QueryForDateTask extends
            AsyncTask<Object, Void, ArrayList<String>> {
        private ProgressDialog mProgressDialog;
        private Activity act;
        private Context context;
        protected ArrayList<String> doInBackground(Object... o) {

            this.mProgressDialog = (ProgressDialog) o[0];
            this.act = (Activity) o[1];
            this.context = (Context) o[2];
            ArrayList<String> listeDate = this.parseJSON(this.startQuerying());

            return listeDate;
        }

        public JSONObject startQuerying() {
            JSONRequest jr = new JSONRequest();

            String from = getResources().getString(R.string.api_param_from);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.FRANCE);
            from += "=" + sdf.format(new Date());
            String url = getResources().getString(
                    R.string.api_dates_json);

            JSONObject jo = jr.getJSONFromUrl(url + "?" + from);
            return jo;
        }

        public ArrayList<String> parseJSON(JSONObject jsonObject) {
            ArrayList<String> l = new ArrayList<String>();
            try {
                JSONArray array = jsonObject.getJSONArray("dates");
                if (array != null) {
                    for (int i = 0; i < array.length(); i++) {
                        String type = array.getString(i);
                        l.add(type);
                    }    // fin parcours JSONArray
                }
            } catch (Exception _e) {
            }
            return l;
        }
        protected void onProgressUpdate(Integer... progress) {
            // setProgressPercent(progress[0]);
        }

        protected void onPostExecute(ArrayList<String> lDate) {
            // Create items for the ListView
            DateAdapter adapter = new DateAdapter(this.context, R.layout.searchitem_date, lDate, this.act);
            // specify the list adaptor
            ((ListView)findViewById(R.id.list)).setAdapter(adapter);
            this.mProgressDialog.dismiss();

        }
    } // fin async
}

我尝试用这个来代替对AsyncTask:的调用

runOnUiThread(new Runnable() {
                public void run() {
                    QueryForDateTask task = new QueryForDateTask();
                    task.execute(DateActivity.this.mProgressDialog, DateActivity.this, DateActivity.this.getApplicationContext());
                }
            });

(如Asynctask中所述,会导致异常';无法在未调用Looper.prepare()的线程内创建处理程序';据我所知),但结果完全一样。

所以我不明白为什么它在这个活动中不起作用,尽管项目的其他部分都可以。

有线索吗?

非常感谢所有的想法:)

只是一篇将故障标记为已解决的帖子:

我使用的适配器在解析参数时出错,并抛出了NullPointerException。我刚刚修复了它,AsyncTask现在运行起来没有问题。

相关内容

最新更新