“无法在AsyncTask中的未调用Looper.prepare()的线程内创建处理程序

时间:2013-08-25 17:33:58

标签: android multithreading android-asynctask

我的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 causes exception 'Can't create handler inside thread that has not called Looper.prepare()'中解释过),但结果完全相同。

所以我无法理解为什么它没有在这项活动中工作,尽管其他项目都可以。

有任何线索吗?

非常感谢所有想法:)

1 个答案:

答案 0 :(得分:0)

只是一个帖子来标记解决的问题:

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