2012-12-09 9 views
12

W jednej z moich aktywności używam AsyncTask. W doInBackground() dzwonię do różnych metod. W jednej z tych metod otrzymuję wyjątek, więc w bloku catch chcę pokazać błąd w Toast. Wiem, że mogę używać Log, ale nadal wolę Toast. Więc, w jaki sposób mogę użyć Toast w AsyncTask w doInBackground()?Jak wyświetlić toast w AsyncTask na stronie doInBackground

+0

dlaczego nie przestrajania błąd do onPostExecute z doInBackground(), a następnie tak ten błąd w toast z onPostExecute –

+0

nie można modyfikować interfejs użytkownika z metoda doInBackground(), spróbuj zwrócić niektóre wyniki i przetestuj na tym wyniku metodę onPostExecute(), jeśli tak, to pokaż Toast – Houcine

+1

@Sam: easy man !! nie przegłosowałem, właśnie dodałem mój komentarz, wiem, że możesz dać dostęp w 'doInBackground()', ale nie jest to zalecane, jeśli tak, to dlaczego istnieją metody 'onProgressUpdate () 'i' onPostExecute() '?? – Houcine

Odpowiedz

10

Można owinąć tosty w runOnUIThread(), ale nie jest to najlepsze rozwiązanie.
Należy ustawić flagę boolowską w bloku catch, gdy wystąpi błąd, a następnie wyświetlić odpowiednią toast za onProgressUpdate(), onPostExecute() lub dowolną z innych metod z dostępem do interfejsu użytkownika, gdy flaga jest true.

+0

Nie rozumiem, że ... + 1'ed to – Ahmad

+1

@Ahmad Oddałem przysługę, ponieważ mamy przecież rację. – Sam

+0

Który kontekst należy przekazać na toast ** getBaseContext() ** lub ** getApplication() ** Kontekst? – hrishikesh

3

można wyświetlać go w sposób, który ma dostęp do wątku UI jak onPreExecute(), onProgressUpdate() i onPostExecute()

17

powrocie z doInBackground jako

protected String doInBackground(String... params){ 
    //some code 
    try{ 
     //some code 
    }catch(Exception e){ 
     return "Exception Caught"; 
    } 
    return someValidResult; 
} 

protected void onPostExecute(String result){ 
    if(result.equalsIgnoreCase("Exception Caught")){ 
     //Display Toast 
    }else{ 
     // // whatever you wana do with valid result 
    } 
} 
6

napisać następujący kod gdzie trzeba pokazać tosty w doInBackground() metodą

runOnUiThread(new Runnable() { 

public void run() { 

    Toast.makeText(getApplicationContext(), "Example for Toast", Toast.LENGTH_SHORT).show(); 

    } 
}); 
  • BTW: jeśli używasz Fragments, trzeba zadzwonić runOnUiThread(...) dzięki swojej aktywności: Metoda

getActivity().runOnUiThread(...)

1
runOnUiThread(new Runnable() { 

public void run() { 

    Toast.makeText(getApplicationContext(), "Example for Toast", Toast.LENGTH_SHORT).show(); 

    } 
}); 

działa perfekcyjnie pokazać toast doInBackground()

4

Tworzenie obiekt obsługi i wykonać wszystkie wiadomości Toast za pomocą tego.

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

    Handler handler=new handler(); 
    handler= new Handler(context.getMainLooper()); 
    handler.post(new Runnable(){ 
     public void run(){ 
      Toast.makeText(context, "Created a server socket",Toast.LENGTH_LONG).show(); 
     } 
    }); 
    } 
0
activity.runOnUiThread(new Runnable() { 
public void run() 
{ 
    Toast.makeText(activity, "Toast teaxt", Toast.LENGTH_SHORT).show(); 
} 
}); 
0

wypróbować ten kod

void showError(final String err) { 
    runOnUiThread(new Runnable() { 
     public void run() { 
      Toast.makeText(downloadprogress.this, err + "error in download", Toast.LENGTH_LONG) 
        .show(); 
     } 
    }); 
    } 
Powiązane problemy