Диалог оповещений и задача ASync - PullRequest
1 голос
/ 24 ноября 2011

Я пытаюсь использовать диалоговое окно Alert и Async Task в упражнении и получаю следующую ошибку

Причина: java.lang.RuntimeException: не удается создать обработчик внутри поток, который не вызвал Looper.prepare ()

Код:

public class loginTask extends AsyncTask<Void, Void, Void> {
    public ProgressDialog loginDialog = new ProgressDialog(
            LoginActivity.this);

    @Override
    protected void onPreExecute() {
        loginDialog.setMessage("Please wait Logging in");
        loginDialog.show();
    }

    @Override
    protected Void doInBackground(Void... params) {

        if(loginUser()) {
            loginDialog.dismiss();
            alertbox("title", "winnn", "Okay");
        } else {
            loginDialog.dismiss();
            alertbox("title", "message", "Okay");
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void unused) {
        loginDialog.dismiss();
        Intent intentHome = new Intent(LoginActivity.this,
                HomeActivity.class);
        startActivity(intentHome);
    }
}

Ответы [ 2 ]

10 голосов
/ 24 ноября 2011

Вы не можете напрямую обновить интерфейс внутри метода doInBackground(). (Да, если вы все еще хотите выполнить, напишите то же самое внутри runOnUiThread() метода внутри doInBackground())

В противном случае, сделайте это внутри метода onPostExecute().

public class loginTask extends AsyncTask<Void, Void, Void> 
{
    public ProgressDialog loginDialog = new ProgressDialog( LoginActivity.this );
    public Boolean flag;

    @Override
    protected void onPreExecute() {
        loginDialog.setMessage("Please wait Logging in");
        loginDialog.show();
    }

    @Override
    protected Void doInBackground(Void... params) {
        if(loginUser())
          flag = true;
        else 
          flag=false;

        return null;
    }

    @Override
    protected void onPostExecute(Void unused) {
        loginDialog.dismiss();

        if(flag)
          alertbox("title", "winnn", "Okay");
        else
          alertbox("title", "message", "Okay");
    }
}
1 голос
/ 24 ноября 2011

onPreexecute и onPostExecute являются частью частей пользовательского интерфейса в задаче Async. DoInBackground является отдельным потоком, поэтому любая вещь, выполняемая внутри doInBackground, должна обрабатываться в форме progressUpdate

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

Пример ссылки: Ссылка

отражает любые изменения, которые необходимо внести в пользовательский интерфейс между процессом doInBackground.

...