Hvordan til at vise en Toast i Android AsyncTask?

Jeg forsøger at vise Toast i min initial_background klasse udvidet med AsyncTask<URL, Integer, Long>. Jeg får denne fejl i logcat.

public class InitialBackgroundTask extends AsyncTask<URL, Integer, Long> {

    @Override
    protected Long doInBackground(URL... params) {
        //TODO Auto-generated method stub
        show a = new show();
        a.loop();
        return null;
    }

public class show {

    void loop()
    {
        for(int i=0; i<10; i++)
        {
            Toast.makeText(MainActivity.me, "test", Toast.LENGTH_LONG).show();
        }
    }
}

Dette er undtagelsen:

05-30 12:08:12.641: E/AndroidRuntime(30840): FATAL EXCEPTION: AsyncTask #1
05-30 12:08:12.641: E/AndroidRuntime(30840): java.lang.RuntimeException: An error occured while executing doInBackground()
05-30 12:08:12.641: E/AndroidRuntime(30840):    at android.os.AsyncTask$3.done(AsyncTask.java:278)
05-30 12:08:12.641: E/AndroidRuntime(30840):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
05-30 12:08:12.641: E/AndroidRuntime(30840):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
05-30 12:08:12.641: E/AndroidRuntime(30840):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
05-30 12:08:12.641: E/AndroidRuntime(30840):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-30 12:08:12.641: E/AndroidRuntime(30840):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
05-30 12:08:12.641: E/AndroidRuntime(30840):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
05-30 12:08:12.641: E/AndroidRuntime(30840):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
05-30 12:08:12.641: E/AndroidRuntime(30840):    at java.lang.Thread.run(Thread.java:856)
05-30 12:08:12.641: E/AndroidRuntime(30840): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
05-30 12:08:12.641: E/AndroidRuntime(30840):    at android.os.Handler.<init>(Handler.java:121)
05-30 12:08:12.641: E/AndroidRuntime(30840):    at android.widget.Toast$TN.<init>(Toast.java:317)
05-30 12:08:12.641: E/AndroidRuntime(30840):    at android.widget.Toast.<init>(Toast.java:91)
05-30 12:08:12.641: E/AndroidRuntime(30840):    at android.widget.Toast.makeText(Toast.java:233)
05-30 12:08:12.641: E/AndroidRuntime(30840):    at   com.example.toast.show.loop(show.java:11)
05-30 12:08:12.641: E/AndroidRuntime(30840):    at com.example.toast.InitialBackgroundTask.doInBackground(InitialBackgroundTask.java:13)
05-30 12:08:12.641: E/AndroidRuntime(30840):    at com.example.toast.InitialBackgroundTask.doInBackground(InitialBackgroundTask.java:1)
05-30 12:08:12.641: E/AndroidRuntime(30840):    at android.os.AsyncTask$2.call(AsyncTask.java:264)
05-30 12:08:12.641: E/AndroidRuntime(30840):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-30 12:08:12.641: E/AndroidRuntime(30840):    ... 5 more

Ovenstående kode viser hele historien. Faktisk, jeg ønsker at vise, toast i doInBackground metode

i doinBanckground() du kan ikke gøre noget UI-relaterede ting, så prøv at vise din toast inde PostExecute () – metoden.
Faktisk, jeg er ved at hente nogle data fra url ‘ er, og jeg har fire Webadresser jeg ønsker at vise, toast én url få hentet og så videre. så hvis jeg vil gøre i dette indlæg vil det ikke kan vises én efter én, vil det kun viser det endelige resultat.

OriginalForfatteren Noman Dilawar | 2013-05-30

7 svar

  1. 27

    Du kan ikke opdatere UI på baggrund tråd. doInBackground() er gældende på den baggrund tråd. Du skal opdatere UI på UI tråd.

          runOnUiThread(new Runnable(){
    
              @Override
              public void run(){
                //update ui here
                //display toast here 
              }
           });

    onPreExecute(), onPostExecute(Result), der er gældende på den UI tråd. Så kan du vise toast her.

    onProgressUpdate(Progress...), påberåbe sig på UI tråd efter et opkald til publishProgress(Progress...) kan bruges til at animere en progress bar eller vis logfiler i et tekstfelt.

    Resultatet af doInBackground() beregning er en parameter til onPostExecute(Result) så returnerer resultatet i doinBackground() og vis din toast i onPostExecute(Result)

    Du kan også bruge en handling som foreslået af @Stine Gedde

    For klarhed, tjek linket nedenfor under emnet: De 4 trin.

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

    tak det virker 🙂

    OriginalForfatteren Raghunandan

  2. 22

    Oprette en handling, objekt og udføre alle dine Toast-beskeder, der bruger det.

    @Override
    protected Void doInBackground(Void... params) {
        Handler handler =  new Handler(context.getMainLooper());
        handler.post( new Runnable(){
            public void run(){
                Toast.makeText(context, "Created a server socket",Toast.LENGTH_LONG).show(); 
            }
        });
      }
    hvad om sammenhæng ?

    OriginalForfatteren Harshal Voonna

  3. 4

    Dette er en anden måde, som ikke er nævnt her som følger:

    Trin 1: Definere Handler som global

    Handler handler;

    Trin 2: Initialisere handler i doInBackground() metode som følger:

    @Override
    protected Void doInBackground(Void... params) {
        Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 1) {
               //your code
            }
        }
      };
    }

    Trin 3:
    Og nu du kan ringe til, at føreren ved hvor som helst i koden ved at kalde

    if(handler != null){
      handler.sendEmptyMessage(1);
    }

    , Hvad du mere kan gøre, er at du kan sende data via handling som følger:

    Message message = new Message();
    Bundle bundle = new Bundle();
    bundle.putInt("KEY", value);
    message.setData(bundle);
    handler.sendMessage(message);

    Og håndtere data på, at du handler som nedenfor

    handler = new Handler(){ 
        @Override
        public void handleMessage(Message message) {
            Bundle bundle = message.getData();
            Integer value = bundle.getInt("KEY");
    
        }
    };

    OriginalForfatteren Pankaj

  4. 2

    vis din Toast i onPostExecute eller onPreExecute. doInBackGround kører på en separat tråd, men de to andre metoder køre på den UI tråd.

    Men hvis det er skal til at vise toast i doInBackGround så du kan bruge Handler.indlæg eller runonUiThread til at udføre toast viser.

    OriginalForfatteren stinepike

  5. 2

    Du ikke kan vise Toast i ikke-UI tråd (jeg.e Do i Baggrunden).Du kan prøve flag koncept.

    public class HttpRequest extends AsyncTask<String[], Void, String> {
        boolean flag=false;
    ....
    ...
    ....
     @Override
        protected String doInBackground(String[]... params) {
       //set flag as true when you need to trigger the Toast
     try{
       //Some Network Calls
         } catch (HttpHostConnectException e) {
        flag=true;   
      //Triggered Flas when i got Exceptions          
           }
    }
     @Override
        protected void onPostExecute(String result) {
            if(flag){
                Toast.makeText(activity, "HttpHostConnectException Occured ", Toast.LENGTH_SHORT).show();
            }
    
    
    }

    Glad Kodning..!!!indtast koden her

    OriginalForfatteren RAJESH KUMAR ARUMUGAM

  6. 0

    Du forsøger at vise toast i ikke-ui tråd, der er grunden til denne fejl apear.

    Hvis du ønsker at vise toast i doInBackground metode, så er du nødt til at skrive din Toast logik inde UI tråd

    kig i nedenstående svar link
    https://stackoverflow.com/a/11797945/582571

    Men det er ikke tilrådeligt at have en UI manipulation under ikke-ui tråd

    OriginalForfatteren rajpara

  7. 0

    vi kan gøre dette ved at passere en grænseflade til AsyncTask klasse og gøre en tilbagekaldsanmodning i onPostExecute metode.

    public interface IResult {
        void onSuccess(String result);
        void onError(String error);                                                  
    }
    
    public static class AsyncTaskClass extends AsyncTask<String, String, Boolean> {
    
        IResult iResult;
    
        AsyncTaskClass(IResult iResult){
            this.iResult = iResult;
        }
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
    
        @Override
        protected Boolean doInBackground(String... params) {
            boolean result;
            try {
                //doing BackGround Operation Here
                result = true;
    
            } catch (Exception e) {
                Log.e(TAG,"Error: " + e.getMessage());
                result = false;
            }
    
           return result;
        }
    
        @Override
        protected void onPostExecute(Boolean success) {
            super.onPostExecute(success);
            Log.w(TAG, "On Post Execute: " + success);
            if(success)
                iResult.onSuccess("AsyncTask done successfully.");
            else
                iResult.onSuccess("Sorry! something went wrong.");
    
        }
    }                                                                      
      IResult iResult = new IResult() {
          @Override
          public void onSuccess(String result) {
              Toast.makeText(PostActivity.this, result, Toast.LENGTH_LONG).show();
          }
    
          @Override
          public void onError(String error) {
              Toast.makeText(PostActivity.this, error, Toast.LENGTH_LONG).show();
          }
      };
      String param1 = "some value 1";
      String param2 = "some value 2";
    
      new AsyncTaskClass(iResult).execute(param1, param2);`

    OriginalForfatteren ImFarhad

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *