2012-12-09 21 views
12

In einer meiner Aktivitäten verwende ich AsyncTask. In doInBackground() mache ich Anrufe zu verschiedenen Methoden. Bei einer dieser Methoden bekomme ich eine Ausnahme, also im Catch-Block möchte ich den Fehler im Toast anzeigen. Ich weiß, ich kann Log verwenden, aber immer noch bevorzuge ich Toast. Also, wie kann ich Toast in AsyncTask in doInBackground() verwenden?Toast in AsyncTask in doInBackground anzeigen

+0

, warum Sie nicht Fehler OnPostExecute von doInBackground sind Neuabstimmung() und dann so dieser Fehler in einem Toast von OnPostExecute –

+0

Sie die Benutzeroberfläche nicht ändern können aus die doInBackground() -Methode, versuchen Sie, einige Ergebnisse zurückgeben, und testen Sie auf dieses Ergebnis in der onPostExecute() -Methode, wenn dies der Fall ist, so zeigen Sie die Toast – Houcine

+1

@Sam: easy man !! Ich habe nicht gewählt, ich habe gerade meinen Kommentar hinzugefügt, ich weiß, dass Sie Zugriff in 'doInBackground()' geben können, aber es ist nicht empfehlenswert, das zu tun, wenn ja, warum gibt es Methoden 'onProgressUpdate () 'und' onPostExecute() '?? – Houcine

Antwort

10

Sie könnten den Toast in runOnUIThread() wickeln, aber das ist nicht die beste Lösung.
Sie sollten ein boolesches Flag im catch-Block setzen, wenn ein Fehler auftritt, und dann einen geeigneten Toast in onProgressUpdate(), onPostExecute() oder einer der anderen Methoden mit UI-Zugriff anzeigen, wenn das Flag true ist.

+0

Ich verstehe das auch nicht ... + 1'ed es – Ahmad

+1

@Ahmad Ich kehrte den Gefallen zurück, da wir doch recht haben. – Sam

+0

Welcher Kontext sollte an toast ** getBaseContext() ** oder ** getApplication() ** Context übergeben werden? – hrishikesh

3

Sie können es in einem Verfahren zeigen, dass onPreExecute(), wie onProgressUpdate() und onPostExecute()

17

Rückkehr aus doInBackground als

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

Schreiben Sie den folgenden Code, wo Sie Toast Zugriff auf die UI-Thread hat zeigen müssen in doInBackground() Methode

runOnUiThread(new Runnable() { 

public void run() { 

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

    } 
}); 
  • BTW: Wenn Sie Fragments verwenden, müssen Sie runOnUiThread(...) durch Ihre Aktivitäten nennen:

getActivity().runOnUiThread(...)

1
runOnUiThread(new Runnable() { 

public void run() { 

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

    } 
}); 

arbeitet völlig in Ordnung, Toast Show in doInBackground() -Methode

4

a Erstellen Handler-Objekt und führen Sie alle Ihre Toast-Nachrichten mit diesem.

@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

versuchen diesen Code

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