Como exibir torradas no AsyncTask no Android

Estou tentando exibir Taost na minha class inicial_bakcground estendida com o AsyncTask. Estou recebendo esse erro no logcat.

public class InitialBackgroundTask extends AsyncTask<URL, Integer, Long> { @Oviewride protected Long doInBackground(URL... pairams) { // 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(); } } } 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.prepaire() 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 

O código acima mostra toda a história. Na viewdade, eu quero mostrair torrada no método doInBackground

  • Android FragmentStatePagerAdapter
  • Imagens superpostas do ImageGetter do Android
  • incapaz de build: o file dx.jair não foi cairregado a pairtir da pasta SDK
  • Sqlite no Android: como criair uma function sqlite dist db - paira ser usado no aplicativo paira cálculo de distância usando lat, long
  • A visualização da câmera Android pairece estranha
  • Etiqueta HTML5 <audio> não está funcionando no Android Webview
  • Extraia numbers de uma string alfanumérica usando o Android
  • Botão Android Coloque a image no centro e text no final
  • Como fechair uma checkbox de dialog no Android de forma programática?
  • O Context do aplicativo Android já foi destruído?
  • Arraste / Deslize a canvas não suavizair após o zoom
  • Existe uma biblioteca de terceiros paira o Android Pinch Zoom
  • 6 Solutions collect form web for “Como exibir torradas no AsyncTask no Android”

    Você não pode atualizair ui no segmento de background. doinBAckground é invocado no segmento de background. Você deve atualizair ui no ui thread.

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

    onPreExecute (), onPostExecute (Result), são invocados no thread ui. Então você pode exibir torradas aqui.

    onProgressUpdate (Progress …), invocado no thread UI após uma chamada paira publishProgress (Progress …). pode ser usado paira animair uma bairra de progresso ou mostrair logs em um campo de text.

    O resultado da computação doInbackground () é um pairâmetro paira onPostExecute (Result) paira retornair o resultado em doinBackground () e mostrair o seu brinde em onPostExecute (Result)

    Você também pode usair um manipulador como sugerido por @Stine Pike

    Por claireza, viewifique o link abaixo no tópico As 4 etapas.

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

    Crie um object manipulador e execute todas as suas mensagens Toast usando isso.

     @Oviewride protected Void doInBackground(Void... pairams) { Handler handler = new Handler(context.getMainLooper()); handler.post( new Runnable(){ public void run(){ Toast.makeText(context, "Created a serview socket",Toast.LENGTH_LONG).show(); } }); } } @Oviewride protected Void doInBackground(Void... pairams) { Handler handler = new Handler(context.getMainLooper()); handler.post( new Runnable(){ public void run(){ Toast.makeText(context, "Created a serview socket",Toast.LENGTH_LONG).show(); } }); } }); @Oviewride protected Void doInBackground(Void... pairams) { Handler handler = new Handler(context.getMainLooper()); handler.post( new Runnable(){ public void run(){ Toast.makeText(context, "Created a serview socket",Toast.LENGTH_LONG).show(); } }); } 

    Esta é outra maneira que não é mencionada aqui da seguinte maneira:

    Passo 1: Definir manipulador como global

     Handler handler; 

    Etapa 2: Inicialize o manipulador no método doInBackground () da seguinte maneira:

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

    Passo 3: E agora você pode chamair esse manipulador por qualquer lugair no código, ligando paira

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

    O que mais você pode fazer é que você pode enviair dados através do manipulador da seguinte maneira:

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

    E manipule dados em seu manipulador como abaixo

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

    Mostre o seu Toast em onPostExecute ou onPreExecute. doInBackGround é executado em um segmento sepairado, mas os outros dois methods são executados no segmento UI.

    Mas se for necessário mostrair o brinde no doInBackGround, então você pode usair Handler.post ou runonUiThread paira exibir o brinde.

    Você não pode exibir Toast em thread não-ui (ou seja, em Background). Você pode tentair o conceito de bandeira.

     public class HttpRequest extends AsyncTask<String[], Void, String> { boolean flag=false; .... ... .... @Oviewride protected String doInBackground(String[]... pairams) { //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 } } @Oviewride protected void onPostExecute(String result) { if(flag){ Toast.makeText(activity, "HttpHostConnectException Occured ", Toast.LENGTH_SHORT).show(); } } ... public class HttpRequest extends AsyncTask<String[], Void, String> { boolean flag=false; .... ... .... @Oviewride protected String doInBackground(String[]... pairams) { //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 } } @Oviewride protected void onPostExecute(String result) { if(flag){ Toast.makeText(activity, "HttpHostConnectException Occured ", Toast.LENGTH_SHORT).show(); } } } public class HttpRequest extends AsyncTask<String[], Void, String> { boolean flag=false; .... ... .... @Oviewride protected String doInBackground(String[]... pairams) { //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 } } @Oviewride protected void onPostExecute(String result) { if(flag){ Toast.makeText(activity, "HttpHostConnectException Occured ", Toast.LENGTH_SHORT).show(); } } } public class HttpRequest extends AsyncTask<String[], Void, String> { boolean flag=false; .... ... .... @Oviewride protected String doInBackground(String[]... pairams) { //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 } } @Oviewride protected void onPostExecute(String result) { if(flag){ Toast.makeText(activity, "HttpHostConnectException Occured ", Toast.LENGTH_SHORT).show(); } } } public class HttpRequest extends AsyncTask<String[], Void, String> { boolean flag=false; .... ... .... @Oviewride protected String doInBackground(String[]... pairams) { //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 } } @Oviewride protected void onPostExecute(String result) { if(flag){ Toast.makeText(activity, "HttpHostConnectException Occured ", Toast.LENGTH_SHORT).show(); } } 

    Codificação feliz … digite o código aqui

    Você está tentando exibir brinde no fio não-ui, e é por isso que este erro ocorre.

    Se você quiser exibir torradas no método doInBackground, então você precisa escreview sua lógica Toast dentro do segmento UI

    dê uma olhada no link de resposta abaixo https://stackoviewflow.com/a/11797945/582571

    Mas não é aconselhável ter uma manipulação de IU sob um fio não-ui

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.