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

时间:2013-05-30 11:09:32

标签: android runtimeexception

我正在制作一个解析在线xml Feed的应用。我使用了片段和标签。

下面是代码

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle       savedInstanceState) {
        // Inflate the layout for this fragment
         View v = inflater.inflate(R.layout.listview_file, container, false);
         allPress_listView = (ListView) v.findViewById(R.id.listView_for_all);
         progressBar=(ProgressBar)v.findViewById(R.id.progress_bar);

         return v;
       /* return inflater.inflate(R.layout.afragment, container, false);
        listView=(ListView)fi*/
    }  

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
       /* ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,Cheese );
        listView.setAdapter(adapter);*/
        progressBar.setVisibility(View.VISIBLE);

        new Thread(new Runnable() {  
           @Override
            public void run() {
            // TODO Auto-generated method stub
            try
              {
                   //Thread.sleep(5000);    
                   new DoSomeTask().execute();                           

              }catch(Exception e){}
                       // myPd_ring.dismiss();
          }
       }).start();

}

问题是当我在安装了Android 4.1.2版的三星Galaxy Mini上运行应用程序时,它运行时不会崩溃,但是当我在较低版本上运行应用程序时,它会崩溃。以下是错误。

E/AndroidRuntime(13631): FATAL EXCEPTION: Thread-164034
E/AndroidRuntime(13631): java.lang.ExceptionInInitializerError
E/AndroidRuntime(13631):    at com.sl.sx.APR$1.run(AllReleases.java:74)
E/AndroidRuntime(13631):    at java.lang.Thread.run(Thread.java:864)
E/AndroidRuntime(13631): Caused by: java.lang.RuntimeException:  Can't create handler inside thread that has not called Looper.prepare()
E/AndroidRuntime(13631):    at android.os.Handler.<init>(Handler.java:121)
E/AndroidRuntime(13631):    at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:607)
E/AndroidRuntime(13631):    at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:607)
E/AndroidRuntime(13631):    at android.os.AsyncTask.<clinit>(AsyncTask.java:190)
E/AndroidRuntime(13631):    ... 2 more

2 个答案:

答案 0 :(得分:2)

首先,应该在UI线程上创建并运行异步任务(请参阅“线程规则”http://developer.android.com/reference/android/os/AsyncTask.html)。

以下是相关规则:

  • 必须在UI线程上加载AsyncTask类。这是从JELLY_BEAN开始自动完成的。
  • 必须在UI线程上创建任务实例。

要解决您的问题,您应该将new DoSomeTask().execute();移出Runnable,或者如果您坚持在Runnable中启动它,那么请使用Activity.runOnUiThread()({{3} })

E.g。

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    progressBar.setVisibility(View.VISIBLE);

    new DoSomeTask().execute();
}

答案 1 :(得分:0)

我猜测DoSomeTask是一个AsyncTask,你试图从后台线程开始。 AsyncTasks只能从UI线程启动。

更改为 -

 @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
       /* ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,Cheese );
        listView.setAdapter(adapter);*/
        progressBar.setVisibility(View.VISIBLE);
         new DoSomeTask().execute();    
}