2013-05-30 2 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(); 

} 

Проблема заключается в том, когда я запустить приложение на Samsung Galaxy Mini, имеющий Android версии 4.1.2, она работать без сбоев, но когда я запускаю приложение на более низкие версии, он выходит из строя , Ниже приведена ошибка.

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

Прежде всего, задачи асинхронных должны быть созданы и работают на потоке пользовательского интерфейса (см «правила» Threading http://developer.android.com/reference/android/os/AsyncTask.html).

Вот соответствующие правила:

  • Класс AsyncTask должны быть загружены в потоке пользовательского интерфейса. Это делается автоматически с JELLY_BEAN.
  • Экземпляр задачи должен быть создан в потоке пользовательского интерфейса.

Чтобы решить вашу проблему, вы должны двигаться 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

Я использовал нижестоящий обработчик mHandler = new Handler (Looper.getMainLooper()); и кажется, что проблема решена, проверка на более низких версиях – user1740281

+0

Здесь вам не нужно создавать никаких обработчиков. См. Мой обновленный ответ. – Justas

+0

Спасибо, что ответили – user1740281

0

Я предполагаю, что DoSomeTask является AsyncTask, который вы пытаетесь запустить из фонового потока. AsyncTasks можно запустить только из потока пользовательского интерфейса.

Изменение 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

Да DoSomeTask - это AsynctASK. Но когда я расширяю Activity, это работает отлично. Почему это бросает ошибку, когда я расширяю фрагмент? – user1740281

+0

Я думаю, что активность или фрагмент здесь не имеет значения. Это зависит от того, запускаете ли вы задачу из потока пользовательского интерфейса или фонового потока. – asloob

+0

Спасибо, что ответили. – user1740281

Смежные вопросы

 Смежные вопросы