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

时间:2011-12-20 23:59:54

标签: android android-asynctask handler runtimeexception looper

我有一个带有ASyncTask的代码,问题是当我多次执行它时会因此异常而崩溃:RuntimeException:每个线程只能创建一个Looper

但后来我读到了这个:https://stackoverflow.com/a/7781280/869180我记得我过去曾遇到过类似的错误,它与在ASyncTask中创建的UI内容(在我的情况下是一个ProgressDialog)有关。

所以我从ASyncTask中删除了所有的UI东西,我也删除了Looper.prepare,以避免RuntimeException,但知道我得到了这个:

12-21 00:34:17.363: W/System.err(18658): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
12-21 00:34:17.371: W/System.err(18658):    at android.os.Handler.<init>(Handler.java:121)
12-21 00:34:17.371: W/System.err(18658):    at android.app.Activity.<init>(Activity.java:683)
12-21 00:34:17.371: W/System.err(18658):    at com.konex.Alaves.Parser.<init>(Parser.java:29)
12-21 00:34:17.371: W/System.err(18658):    at com.konex.Alaves.News$LoadNews.doInBackground(News.java:131)

以下是代码:

private class LoadNews extends AsyncTask<String, Void, Void> 
{
    private List<Noticia> data = new ArrayList<Noticia>();

    @Override
    protected void onPreExecute() {
        m_dialog.show();
    }

    @Override
    protected Void doInBackground(String... url) {
        try {

//          Looper.myLooper();
//          Looper.prepare();
            Parser parser = new Parser(url[0], url[1]);
            data = parser.run();

           } catch (Exception e) { 
               e.printStackTrace();
           }
        return null;
    }

@Override
    protected void onPostExecute(Void result) {

            m_dialog.dismiss();

        if(data !=null )                
            showNewContent(data);
    }
}

我确定我错过了一些东西,或者我做错了什么,但我无法在任何地方找到它。

非常感谢

2 个答案:

答案 0 :(得分:2)

正如堆栈跟踪告诉您的那样,您的问题源自Parser.java初始值设定项中Parser的第29行。您会注意到,这不是您在此处包含的源代码,而是LoadNews

基于堆栈跟踪的前一行,可以是:

  • Parser继承自Activity

  • Parser正在尝试实例化Activity

这些都不可能。

答案 1 :(得分:0)

也许在LoadNews类之外实例化Parser并传递对它的引用?