2015-07-18 4 views
0

Я получаю эту ошибку из моего андроида журнал, и я посмотрел на другие потоки, которые имеют проблем такого рода, но я до сих пор не могу решить мою собственную проблемуНевозможно создать обработчик внутри нити - Android

В принципе, я бы хочу обновить свой интерфейс от класса обслуживания с помощью механизма обратного вызова

//this method is inside the fragment class 
public void updateProgress(int progress){ 
    switch(progress){ 
     case Constants.ProgressUIPostUser.PD_VALIDATE_USER: 
      pdPostUserLoading = ProgressDialog.show(getActivity(), "Registration", "Validating user...", true, false); 
      break; 
     case Constants.ProgressUIPostUser.PD_POSTING_DATA: 
      pdPostUserLoading = ProgressDialog.show(getActivity(), "Registration", "Posting data...", true, false); 
      break; 
     case Constants.ProgressUIPostUser.PD_OPEN_CONNECTION: 
      pdPostUserLoading = ProgressDialog.show(getActivity(), "Registration", "Open connection...", true, false); 
      break; 
     case Constants.ProgressUIPostUser.PD_OBTAINING_RESPONSE: 
      pdPostUserLoading = ProgressDialog.show(getActivity(), "Registration", "Obtaining Response...", true, false); 
      break; 
     case Constants.ProgressUIPostUser.PD_DISMISS: 
      if(pdPostUserLoading != null) 
       pdPostUserLoading.dismiss(); 
      break; 


    } 
} 

Тогда я назвал это утверждение из класса процессора (который вызывается из класса обслуживания)

callback.updateProgress(Constants.ProgressUIPostUser.PD_OPEN_CONNECTION); 

Из класса обслуживания

public interface Callback { 
    void updateProgress(int progress); 
} 

class Task implements Runnable{ 
    public void run(){ 
     PostNewUserProcessor processor = new PostNewUserProcessor(mCallback); 
     boolean valid = processor.postUser(newUser); 

     if(valid){ 
      //Todo 
     } 
     else{ 
      //TODO 
     } 
    } 

public void postUser(Bundle data){ 

     //Retrieve data from the intent 
    newUser = data.getParcelable(Constants.NEW_USER); 

    new Thread(new Task()); 
} 

Лог ошибок

07-18 18:52:44.994 8942-9612/? E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-1137 
    java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
      at android.os.Handler.<init>(Handler.java:197) 
      at android.os.Handler.<init>(Handler.java:111) 
      at android.app.Dialog.<init>(Dialog.java:108) 
      at android.app.AlertDialog.<init>(AlertDialog.java:114) 
      at android.app.AlertDialog.<init>(AlertDialog.java:98) 
      at android.app.ProgressDialog.<init>(ProgressDialog.java:77) 
      at android.app.ProgressDialog.show(ProgressDialog.java:110) 
      at android.app.ProgressDialog.show(ProgressDialog.java:104) 
      at com.robertlimantoproject.bookreviewapp.activity.RegistrationPageFragment.updateProgress(RegistrationPageFragment.java:354) 
      at com.robertlimantoproject.bookreviewapp.processor.PostNewUserProcessor.postUser(PostNewUserProcessor.java:81) 
      at com.robertlimantoproject.bookreviewapp.service.PostNewUserService$Task.run(PostNewUserService.java:61) 
      at com.robertlimantoproject.bookreviewapp.utils.Util$1.run(Util.java:36) 
+0

какие проблемы вы говорите? – pskink

+0

Прошу прощения, я только что закончил редактирование сообщения, мог бы снова взглянуть? –

+1

Вы видите раздел "Родственные" в правой части этой страницы? – pskink

ответ

1

Вы звоните PostNewUserProcessor processor = new PostNewUserProcessor(mCallback); из потока без пользовательского интерфейса.

Но отображение диалога должно быть записано в потоке пользовательского интерфейса. как это ..

case Constants.ProgressUIPostUser.PD_VALIDATE_USER: 
      getActivity().runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       pdPostUserLoading = ProgressDialog.show(getActivity(), "Registration", "Validating user...", true, false); 

      } 
     }); 
      break; 
+0

Большое спасибо, это работает !!! я до сих пор не знаю, почему это по умолчанию не по умолчанию, так как я поместил метод внутри фрагмента активности, который предположительно станет основным потоком? не могли бы вы мне объяснить? –

+0

Как я могу поставить это как ответ в своем посте? –

+0

Как я уже сказал, вы передаете обратный вызов ** Процессор PostNewUserProcessor = новый PostNewUserProcessor (mCallback); ** в потоке без UI. Затем метод обратного вызова ** updateProgress() ** будет работать в том же потоке, откуда он вызывается. я. e - неинтерфейсная нить. – Emil

0

Just Add

Looper.prepare(); 

внутри нити в качестве первого оператора.

Узнайте больше о нити петлителя, прочитав:

Looper Thread

0

Как говорит ошибка, вы забыли добавить looper.prepare внутри потока.
Посмотрите здесь:
Can't create handler inside thread which has not called Looper.prepare() и
Can't create handler inside thread that has not called Looper.prepare() in android.
Далее, для того, чтобы осуществить то, что вы хотите взглянуть здесь:
Can't see ProgressDialog while AsyncTask run in background
Учебник:
http://www.41post.com/4588/programming/android-coding-a-loading-screen-part-1

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