2012-12-09 24 views
12

In una delle mie attività sto usando AsyncTask. In doInBackground() sto effettuando chiamate a vari metodi. In uno di questi metodi sto ricevendo un'eccezione, quindi nel blocco catch voglio mostrare l'errore nel Toast. So che posso usare Log, ma preferisco ancora Toast. Quindi, come posso utilizzare Toast in AsyncTask in doInBackground()?Come mostrare il toast in AsyncTask in doInBackground

+0

perché non si è risintonizzare errore OnPostExecute da doInBackground() e poi così questo errore in un brindisi da OnPostExecute –

+0

non è possibile modificare l'interfaccia utente da il metodo doInBackground(), prova a restituire alcuni risultati e verifica su quel risultato nel metodo onPostExecute(), se lo è, quindi mostra il Toast – Houcine

+1

@Sam: easy man !! non ho votato, ho appena aggiunto il mio commento, so che puoi dare l'accesso in 'doInBackground()', ma non è raccomandato farlo, se è così, allora perché ci sono metodi 'suProgressUpdate () 'e' onPostExecute() '?? – Houcine

risposta

10

Si potrebbe avvolgere il toast in runOnUIThread() ma questa non è la soluzione migliore.
È necessario impostare un flag booleano nel blocco catch quando si verifica un errore, quindi visualizzare un Toast appropriato in onProgressUpdate(), onPostExecute() o uno qualsiasi degli altri metodi con accesso all'interfaccia utente ogniqualvolta il flag è true.

+0

Non capisco che ... + l'ho fatto +1 – Ahmad

+1

@Ahmad Ho restituito il favore, visto che dopotutto abbiamo ragione. – Sam

+0

Quale contesto deve essere passato per brindare ** getBaseContext() ** o ** getApplication() ** Contesto? – hrishikesh

3

È possibile visualizzarlo in un metodo, che ha accesso al thread UI come onPreExecute(), onProgressUpdate() e onPostExecute()

17

ritorno da doInBackground come

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

scrivere il seguente codice in cui si deve mostrare brindisi in doInBackground() metodo

runOnUiThread(new Runnable() { 

public void run() { 

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

    } 
}); 
  • BTW: se si utilizza Fragments, è necessario chiamare runOnUiThread(...) attraverso la vostra attività: metodo

getActivity().runOnUiThread(...)

1
runOnUiThread(new Runnable() { 

public void run() { 

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

    } 
}); 

sta lavorando benissimo per mostrare brindisi in doInBackground()

4

Creare un oggetto gestore ed esegui tutti i tuoi messaggi Toast usando quello.

@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

provare questo codice

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