2013-12-17 5 views
0

В моем приложении у меня есть класс sercice, что у него есть этот метод, чтобы показать диалог прогресса, когда сделать что-то:Android: Невозможно создать обработчик внутри потока, который не называется Looper.prepare()

private void openprogresdialog() { 

new AsyncTask<Integer, Integer, Boolean>() 
{ 
    ProgressDialog progressDialog; 

    @Override 
    protected void onPreExecute() 
    { 
     progressDialog = ProgressDialog.show(thisActivity, "Dialog","Loading..."); 
    } 

    @Override 
    protected Boolean doInBackground(Integer... params) 
    { 
     if (params == null) 
     { 
      return false; 
     } 
     try 
     { 
      Thread.sleep(params[0]); 
     } 
     catch (Exception e) 
     { 
      Log.e("tag", e.getMessage()); 
      return false; 
     } 

     return true; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) 
    { 
     progressDialog.dismiss(); 
     AlertDialog.Builder b = new AlertDialog.Builder(thisActivity); 
     b.setTitle(android.R.string.dialog_alert_title); 
     if (result) 
     { 
      b.setMessage("Download succeeded"); 
     } 
     else 
     { 
      b.setMessage("Download failed"); 
     } 
     b.setPositiveButton(getString(android.R.string.ok), 
       new DialogInterface.OnClickListener() 
       { 

        @Override 
        public void onClick(DialogInterface dlg, int arg1) 
        { 
         dlg.dismiss(); 
        } 
       }); 
     b.create().show(); 
    } 
}.execute(2000); 

new Thread() 
{ 
    @Override 
    public void run() 
    { 

     DialogInterface progressDialog = null; 
     progressDialog.dismiss(); 
    } 
}.start(); 
} 

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

Невозможно создать обработчик внутри потока, который не под названием Looper.prepare()

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

EDIT:

public class MyService extends Service { 
    private static final String TAG = "MyService"; 
    Thread readthread; 
    final MyService thisActivity = this; 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     final ParentActivityData data = intent.getParcelableExtra("DATA"); 

     readthread = new Thread(new Runnable() { 
      public void run() { 
       // SOME CODE TO EXECUTE // 
       } 
       openprogresdialog(); 
      } 
     }); 

     readthread.start(); 

     Log.d(TAG, "onCreate"); 

     return super.onStartCommand(intent, flags, startId); 
    } 

    @Override 
    public void onCreate() { 
    } 

    @Override 
    public void onDestroy() { 

    } 
} 
+1

'progressDialog.dismiss();' this in thread.удалить сам поток – Raghunandan

ответ

1

Вы

readthread = new Thread(new Runnable() { 
      public void run() { 

В методе выполнения потока вы ahve

openprogresdialog(); 

В openprogresdialog у вас есть AsyncTask и нить.

Asynctask должен быть загружен в нить ui. Ознакомьтесь с темой правил Threading в приведенной ниже ссылке.

http://developer.android.com/reference/android/os/AsyncTask.html

Can't create handler inside thread that has not called Looper.prepare() 

Вы не можете обновить пользовательский интерфейс в фоновом потоке. Ui должен быть обновлен в потоке ui. Ваша Asynctask выглядит отлично, но должна быть загружена в поток ui.

Также снимите нижеследующее, что бесполезно. Будет также дать NullPointerException поскольку progressDialog не инициализирован, и вы называете dismiss до инициализации

new Thread() 
{ 
    @Override 
    public void run() 
    { 

     DialogInterface progressDialog = null; 
     progressDialog.dismiss(); // even if initialized cannot update ui in a thread 
    } 
}.start(); 
+1

Благодарим вас за помощь. –

0

Просто добавьте Looper.prepare(); на самого начало Вашего нити

new Thread() 
    { 
     @Override 
     public void run() 
     { 
      Looper.prepare(); 
      DialogInterface progressDialog = null; 
      progressDialog.dismiss(); 
     } 
    }.start(); 
+0

это не работает, опять же эта ошибка. –

+0

@ElhamGdz удаляет нить, которая ничего не делает. асинктас прекрасен. Также вы не можете обновить ui из потока. Это должно быть сделано на нити ui. 'DialogInterface progressDialog = null; progressDialog.dismiss(); 'даст NPE coz' progressDialog' is null – Raghunandan

+0

@Gooziec: я удаляю Thread(), но снова получаю эту ошибку. –

1

Хотя добавление Looper.prepare(), вероятно, является правильным выбором, я предпочел бы добавить использование Activity#runOnUIThread если то возможно Вот. Кроме того, почему вы все равно используете поток?

Здесь нет необходимости использовать эту тему.

Btw: Ваш код

DialogInterface progressDialog = null; 
progressDialog.dismiss(); 

произведет NullPointerException ...

+0

, так что я делаю вместо него? –

+0

@ ElhamGdz после вашего редактирования, мой ответ теперь недействителен. – Lovis

0

Вы должны сделать вызов пользовательского интерфейса в главном потоке пользовательского интерфейса. Если вы делаете в каком-то другом потоке, вы получите эту ошибку. Поскольку вы вызываете progressDialog.dismiss из нового Thread(), вы получаете это сообщение об ошибке.

0
new Thread() 
    { 
     @Override 
     public void run() 
     { 
      Looper.prepare(); 

      //Your Dialog goes here 

      Looper.loop(); 
     } 
    }.start(); 

HtH.

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

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