Java.lang.RuntimeException: Se ha producido un error al ejecutar doInBackground ()

A veces tengo este error de error en mi aplicación

java.lang.RuntimeException: An error occured while executing doInBackground() 

Este es el logCat completo:

 java.lang.RuntimeException: An error occured while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:200) at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) at java.util.concurrent.FutureTask.setException(FutureTask.java:125) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) at java.lang.Thread.run(Thread.java:1019) Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() at android.os.Handler.<init>(Handler.java:121) at android.widget.Toast.<init>(Toast.java:68) at android.widget.Toast.makeText(Toast.java:231) at kostas.menu.olympiakos.nea.loadFeed(nea.java:84) at kostas.menu.olympiakos.nea.access$1(nea.java:75) at kostas.menu.olympiakos.nea$BackgroundAsyncTask_nea.doInBackground(nea.java:242) at kostas.menu.olympiakos.nea$BackgroundAsyncTask_nea.doInBackground(nea.java:1) at android.os.AsyncTask$2.call(AsyncTask.java:185) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) ... 4 more 

Y este es mi código de clase .nea:

 package kostas.menu.olympiakos; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import android.app.Dialog; import android.app.ListActivity; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.Window; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.AnimationSet; import android.view.animation.LayoutAnimationController; import android.view.animation.TranslateAnimation; import android.widget.Button; import android.widget.ImageView; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast; public class nea extends ListActivity{ private List<Message> messages; List<String> des = new ArrayList<String>();//to prosthesa gia na anoigei to keimeno sto alert List<String> text = new ArrayList<String>();//to prosthesa gia na anoigei o titlos sto alert List<URL> url = new ArrayList<URL>();//to prosthesa gia to koumpi pou pigainei sto link List<String> imgl = new ArrayList<String>();//to prosthesa gia na anoigei to keimeno sto alert @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main2); if(isInternetOn()) { new BackgroundAsyncTask_nea().execute(); }else{ Toast.makeText(nea.this,R.string.no_connection, Toast.LENGTH_SHORT).show(); finish(); } } private void loadFeed(AsyncTask<Void, Void, Void> asyncTask){ try{ BaseFeedParser parser = new BaseFeedParser(); messages = parser.parse(); } catch (Throwable t){ Log.e("OSFP.News",t.getMessage(),t); Toast.makeText(nea.this, "Χρειάζεστε σύνδεση στο internet", Toast.LENGTH_SHORT).show(); finish(); } } private void displayRss(){ ArrayList<HashMap<String, String>> List_nea = new ArrayList<HashMap<String, String>>(messages.size()); for (Message msg : messages){ des.add(msg.getDescription());// keimeno text.add(msg.getTitle());// titlos url.add(msg.getLink());// link imgl.add(msg.getImgLink()); HashMap<String, String> map = new HashMap<String, String>(); map.put("name", msg.getTitle()); map.put("date", msg.getDate()); List_nea.add(map); ListAdapter mSchedule = new SimpleAdapter(this, List_nea, R.layout.row, new String[] {"name", "date"}, new int[] {R.id.TextView01, R.id.TextView02}); this.setListAdapter(mSchedule); } AnimationSet set = new AnimationSet(true); Animation animation = new AlphaAnimation(0.0f, 1.0f); animation.setDuration(400); set.addAnimation(animation); animation = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0.0f,Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, -1.0f,Animation.RELATIVE_TO_SELF, 0.0f ); animation.setDuration(400); set.addAnimation(animation); LayoutAnimationController controller = new LayoutAnimationController(set, 0.5f); ListView listViewn = getListView(); listViewn.setLayoutAnimation(controller); } protected void onListItemClick(ListView l, View v, final int position, long id) { super.onListItemClick(l, v, position, id); Dialog dialog = new Dialog(this); String description = des.get(position).toString().replaceAll("\\<.*?>",""); String imagee=imgl.get(position).toString(); final URL link = url.get(position); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.single); dialog.setCancelable(true); Toast msg = Toast.makeText(nea.this, "The url is : "+imagee, Toast.LENGTH_LONG); msg.show(); //xrisimopoiisa toast gia na elegxw poio link pernw apo to site TextView title_dialog = (TextView) dialog.findViewById(R.id.title_dialog); title_dialog.setText(text.get(position)); TextView text = (TextView) dialog.findViewById(R.id.descr); text.setText(description); ImageView image1 = (ImageView) dialog.findViewById(R.id.image1); try { //where imageUrl is what you pulled out from the rss feed Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(imagee).getContent()); image1.setImageBitmap(bitmap); } catch (MalformedURLException e) { //log exception here } catch (IOException e) { //log exception here } Button btnt = (Button) dialog.findViewById(R.id.btnrss);//ti kanei to koumpi otan to patas gia to link btnt.setOnClickListener(new View.OnClickListener() { public void onClick (View view) { Intent viewMessage = new Intent(Intent.ACTION_VIEW, Uri.parse(link.toExternalForm())); startActivityForResult(viewMessage, 0); } }); dialog.show(); } //options menu @Override public boolean onCreateOptionsMenu(Menu menu2) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu2, menu2); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.refresh: new BackgroundAsyncTask_nea().execute(); break; } return true; } public class BackgroundAsyncTask_nea extends AsyncTask<Void, Void, Void> { private ProgressDialog dialog; int myProgress; @Override protected void onPostExecute(Void result) { displayRss(); dialog.dismiss(); } @Override protected void onPreExecute() { // TODO Auto-generated method stub dialog = ProgressDialog.show(nea.this, "", "Loading. Please wait...", true); myProgress = 0; } protected void onProgressUpdate(Integer... progress) { // TODO Auto-generated method stub //super.onProgressUpdate(values); dialog.setProgress(progress[0]); } @Override protected Void doInBackground(Void... arg0) { // TODO Auto-generated method stub loadFeed(this); return null; } } public final boolean isInternetOn() { ConnectivityManager connec = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); // ARE WE CONNECTED TO THE NET if ( connec.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED || connec.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTING || connec.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTING || connec.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED ) { // MESSAGE TO SCREEN FOR TESTING (IF REQ) //Toast.makeText(this, connectionType + ” connected”, Toast.LENGTH_SHORT).show(); return true; } else if ( connec.getNetworkInfo(0).getState() == NetworkInfo.State.DISCONNECTED || connec.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED ) { //System.out.println(“Not Connected”); return false; } return false; } } 

¿Por qué estoy recibiendo este error? ¿Cómo puedo resolverlo? Gracias 🙂

EDITAR:

 Public void toast_doInBck(View view) { // Do something long Runnable runnable = new Runnable() { @Override public void run() { for (int i = 0; i <= 10; i++) { Toast.makeText(nea.this,R.string.no_connection, Toast.LENGTH_SHORT).show(); handler.post(new Runnable() { @Override public void run() { } }); } } }; new Thread(runnable).start(); } 

EDIT2:

  private void loadFeed(AsyncTask<Void, Void, Void> asyncTask){ try{ BaseFeedParser parser = new BaseFeedParser(); messages = parser.parse(); } catch (Throwable t){ Log.e("OSFP.News",t.getMessage(),t); Looper.prepare(); Toast.makeText(nea.this, "Παρακαλώ προσπαθήστε αργότερα..", Toast.LENGTH_SHORT).show(); finish(); Looper.loop(); } } 

Esto es probablemente porque estás intentando mostrar algo en doInBackground (). DoInBackground se ejecuta en un hilo de trabajo que no puede hacer ningún trabajo de interfaz de usuario (incluyendo mostrar tostadas, que es lo que está haciendo). En su lugar, todo el trabajo de la interfaz de usuario debe realizarse en onPostExecute ().

No puede realizar ningún trabajo de GUI en un subproceso de fondo. En su lugar, debe publicar un Runnable en un controlador creado en el subproceso de GUI para que su Toast se ejecute en el subproceso correcto.

EDIT: Ya que la etiqueta de la tarea fue quitada, daré un esquema cómo hacerlo;

  • New () hasta un Handler en su hilo GUI (onCreate es un buen lugar) y guardarlo en una variable miembro, digamos "handler".
  • Mover mostrando tu Toast a un Runnable (la clase anónima es bastante buena para esto)
  • Para mostrar el brindis, haga un handler.post () con su Runnable como parámetro. El Runnable se ejecutará en el subproceso GUI.

Para ver un ejemplo completo, consulte este artículo .

Estás mostrando un Toast en loadFeed que se llama en la parte doInBackground de tu AsyncTask . No debe acceder a la interfaz de usuario desde allí.

Creo que en este código Toast hacer el problema para usted,

 catch (Throwable t){ Log.e("OSFP.News",t.getMessage(),t); Toast.makeText(nea.this, "Χρειάζεστε σύνδεση στο internet", Toast.LENGTH_SHORT).show(); finish(); } 

Porque usted está tratando de hacer la UI operation de hilo de trabajo de AsyncTask esto nunca se permitirá ..

UPDATE: Si desea actualizar algo desde el doInBackGround() de AsyncTask use publishProgress(Progress...) y onProgressUpdate(Progress...) .

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.