2013-05-30 60 views
0

我正在制作一个解析在线xml源的应用程序。我已经使用片段和标签。Android ExceptionInitializerError无法在未调用Looper.prepare()的线程内创建处理程序

下面

是代码

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迷你应用程序,但是当我运行在较低版本的应用程序,它崩溃。以下是错误。

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

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

下面是相关的规则:

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

解决你的问题,你应该将new DoSomeTask().execute();Runnable,或者如果你坚持在一个Runnable启动它,然后使用Activity.runOnUiThread()http://developer.android.com/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29

例如

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

    new DoSomeTask().execute(); 
} 
+0

我使用了下面的一行Handler mHandler = new Handler(Looper.getMainLooper());并且似乎问题已解决,请检查较低版本 – user1740281

+0

您不需要在此处创建任何处理程序。看到我更新的答案。 – Justas

+0

谢谢你的回复 – user1740281

0

我猜测DoSomeTask是你正试图从后台线程启动的AsyncTask。 AsyncTasks只能从UI线程启动。

变化TO-

@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();  
} 
+0

yes DoSomeTask是一个AsynctASK。但是,当我扩展活动,这工作得很好。为什么当我扩展片段时抛出错误? – user1740281

+0

我认为Activity或Fragment在这里没有什么区别。这取决于您是从UI线程还是后台线程开始执行任务。 – asloob

+0

谢谢你的回答。 – user1740281

相关问题