ошибка циклирования при выполнении AsyncTask?

#android

#Android

Вопрос:

 05-18 17:53:35.318: WARN/System.err(474): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
05-18 17:53:35.349: WARN/System.err(474):     at android.os.Handler.<init>(Handler.java:121)
05-18 17:53:35.349: WARN/System.err(474):     at android.app.Dialog.<init>(Dialog.java:101)
05-18 17:53:35.358: WARN/System.err(474):     at android.app.AlertDialog.<init>(AlertDialog.java:63)
05-18 17:53:35.358: WARN/System.err(474):     at android.app.ProgressDialog.<init>(ProgressDialog.java:80)
05-18 17:53:35.377: WARN/System.err(474):     at android.app.ProgressDialog.<init>(ProgressDialog.java:76)
05-18 17:53:35.377: WARN/System.err(474):     at com.Utils.SProgress.StartProgress(SProgress.java:42)
05-18 17:53:35.387: WARN/System.err(474):     at com.FindMe.DisplayAtms$Asyctast.onPreExecute(DisplayAtms.java:880)
05-18 17:53:35.400: WARN/System.err(474):     at android.os.AsyncTask.execute(AsyncTask.java:391)
05-18 17:53:35.400: WARN/System.err(474):     at com.FindMe.DisplayAtms.LoadFunction(DisplayAtms.java:141)
05-18 17:53:35.408: WARN/System.err(474):     at com.FindMe.MyApplication$AsyncATMS.doInBackground(MyApplication.java:207)
05-18 17:53:35.419: WARN/System.err(474):     at com.FindMe.MyApplication$AsyncATMS.doInBackground(MyApplication.java:1)
05-18 17:53:35.419: WARN/System.err(474):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
05-18 17:53:35.427: WARN/System.err(474):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-18 17:53:35.438: WARN/System.err(474):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-18 17:53:35.438: WARN/System.err(474):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
05-18 17:53:35.447: WARN/System.err(474):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
05-18 17:53:35.458: WARN/System.err(474):     at java.lang.Thread.run(Thread.java:1096)
  

мой код

 Another function()
{

anotherSingletonprogressdiloag.hide();

.new Asyctast().execute();


}




public class Asyctast extends AsyncTask<Void, Object, Void>
    {

     private ProgressDialog dialog = new ProgressDialog(DisplayAtms.this);

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            dialog.show();

        }


       @Override
        protected void onProgressUpdate(final Object... args) {
            super.onProgressUpdate(args);
            if ((Boolean) args[0]) {
                Toast.makeText(DisplayAtms.this, args[1].toString(),
                        Toast.LENGTH_LONG).show();
            }
        }

       @Override
        protected Void doInBackground(Void... arg0) {
             Log.d("Asynctask", "" arg0);  


                publishProgress(true,"sd sdfsdf");


                return null;

        }

    }
  

я запускаю поток этой задачи после того, как другой диалог, размещенный в классе signleton, остановлен, а затем я пытаюсь запустить другой диалог выполнения внутри AsyncTask
итак, это второе диалоговое окно при предварительном выполнении вызывает ошибку цикла, кто-нибудь подскажет мне, как избавиться от этой проблемы?

Ответ №1:

 private final Runnable Example= new Runnable() 
    {
        public void run() 
        {
            try 
            {
                //put ur code which cause the looper error              
            } 
            catch (Exception e) 
            {
                e.printStackTrace();
            }
        }
    };
    private final Handler mHandler = new Handler();**
  

и вызовите следующую внутри вашей асинхронной задачи

 mHandler.post(Example);
  

надеюсь, вы понимаете.

Комментарии:

1. да, я правильно понял, я использовал runOnUiThread (exampleRunable) в on pore execute и переместил этот код в тот runnable, который является альтернативой этому. Спасибо

Ответ №2:

Как уже сказал другой. Вы не можете редактировать пользовательский интерфейс из метода doInBackground() AsyncTask напрямую. Но вы можете использовать onProgressUpdate (Прогресс …) и publishProgress (Прогресс …) для обновления пользовательского интерфейса. Таким образом, вы можете придерживаться концепции AsyncTask без явного использования обработчика.

Ответ №3:

Вы не можете изменять пользовательский интерфейс из asynctask во время его выполнения — только при предварительном или последующем выполнении.

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

Комментарии:

1. не могли бы вы, пожалуйста, указать мне здесь, как переместить его в такой обработчик?