2010-09-01 1 views
76

Я не понимаю, почему я получаю эту ошибку. Я использую AsyncTask для запуска некоторых процессов в фоновом режиме.Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare() внутри AsyncTask для ProgressDialog

у меня есть:

protected void onPreExecute() 
{ 
    connectionProgressDialog = new ProgressDialog(SetPreference.this); 
    connectionProgressDialog.setCancelable(true); 
    connectionProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
    connectionProgressDialog.setMessage("Connecting to site..."); 
    connectionProgressDialog.show(); 

    downloadSpinnerProgressDialog = new ProgressDialog(SetPreference.this); 
    downloadSpinnerProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
    downloadSpinnerProgressDialog.setMessage("Downloading wallpaper..."); 
} 

Когда я вхожу в doInBackground() в зависимости от состояния I:

[...]  
connectionProgressDialog.dismiss(); 
downloadSpinnerProgressDialog.show(); 
[...] 

Всякий раз, когда я пытаюсь downloadSpinnerProgressDialog.show() я получаю сообщение об ошибке.

Любые идеи парней?

ответ

103

Метод show() должен быть вызван из User-Interface (UI) thread, в то время как doInBackground() работает на другом потоке, который является главной причиной, почему AsyncTask был разработан.

Вы должны позвонить show() либо в onProgressUpdate(), либо в onPostExecute().

Например:

class ExampleTask extends AsyncTask<String, String, String> { 

    // Your onPreExecute method. 

    @Override 
    protected String doInBackground(String... params) { 
     // Your code. 
     if (condition_is_true) { 
      this.publishProgress("Show the dialog"); 
     } 
     return "Result"; 
    } 

    @Override 
    protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
     connectionProgressDialog.dismiss(); 
     downloadSpinnerProgressDialog.show(); 
    } 
} 
+3

Это не сделать трюк для меня, просто пытался «AlertDialog .Builder builder = new AlertDialog.Builder (контекст); " и добавила конфигурацию строителя. Попытка показать это внутри onProgressUpdate приводит к точно такой же ошибке. Есть идеи ? – ins0m

+0

Спасибо Konstantin, я не знал, что вы можете переопределить onProgressUpdate с любым типом переменной, используя publishProgress(). Действительно помог мне, просто обновить сообщения с тостами. – wired00

75

У меня была аналогичная проблема, но от чтения этот вопрос, я полагал, что я мог бы работать на UI потоке:

YourActivity.this.runOnUiThread(new Runnable() { 
    public void run() { 
     alertDialog.show(); 
    } 
}); 

Кажется, сделать трюк для меня.

+0

thanx работал ... – Debasish

0
final Handler handler = new Handler() { 
     @Override 
     public void handleMessage(final Message msgs) { 
     //write your code hear which give error 
     } 
     } 

new Thread(new Runnable() { 
    @Override 
    public void run() { 
    handler.sendEmptyMessage(1); 
     //this will call handleMessage function and hendal all error 
    } 
    }).start(); 
1

У меня было трудное время, делая эту работу тоже решение для меня было использовать как hyui и Konštantín ответы,

class ExampleTask extends AsyncTask<String, String, String> { 

// Your onPreExecute method. 

@Override 
protected String doInBackground(String... params) { 
    // Your code. 
    if (condition_is_true) { 
     this.publishProgress("Show the dialog"); 
    } 
    return "Result"; 
} 

@Override 
protected void onProgressUpdate(String... values) { 

    super.onProgressUpdate(values); 
    YourActivity.this.runOnUiThread(new Runnable() { 
     public void run() { 
      alertDialog.show(); 
     } 
    }); 
} 

} 
+0

Я думал, что вещи, сделанные в 'onProgressUpdate()', автоматически запускались в потоке пользовательского интерфейса –

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

  • Нет связанных вопросов^_^