2013-05-30 59 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

相關問題