2012-01-20 16 views
12

A volte ottengo questo errore incidente nella mia appjava.lang.RuntimeException: è verificato un errore durante l'esecuzione doInBackground()

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

Questo è il logcat piena:

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 

e questo è il mio codice della classe .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; 
     } 
} 

Perché mi appare questo errore Come posso risolverlo Thanks :)

012.351.641.061.745??

EDIT:

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(); 

      } 
    } 
+0

Hai letto il messaggio? 'Impossibile creare il gestore all'interno del thread che non ha chiamato Looper.prepare()' – SLaks

+0

Sì, l'ho letto ma non so come risolverlo! Chiama Looper.prepare prima del mio toast e poi Looper.Loop dopo? – user1156210

risposta

1

si sta mostrando un Toast in loadFeed che si chiama nella doInBackground parte del vostro AsyncTask. Non dovresti accedere all'interfaccia utente da lì.

+0

C'è un modo per brindare se il try {} di loadFeed() non funziona? – user1156210

26

Ciò è probabilmente dovuto al fatto che si sta tentando di visualizzare qualcosa su doInBackground(). doInBackground viene eseguito in un thread di lavoro che non può eseguire alcuna interfaccia utente (compresa la visualizzazione di Toasts, che è ciò che stai facendo). Invece, tutta la funzionalità dell'interfaccia utente dovrebbe essere eseguita su onPostExecute().

+0

grazie per la tua risposta! L'interfaccia utente è finita su onPostExecute! Ho appena brindato nel doInBackground se c'è un problema con la mia connessione.Non è possibile? – user1156210

1

Penso che in questo codice Toast problema fare per voi,

catch (Throwable t){ 
       Log.e("OSFP.News",t.getMessage(),t); 

       Toast.makeText(nea.this, "Χρειάζεστε σύνδεση στο internet", 
         Toast.LENGTH_SHORT).show(); 
       finish(); 

      } 

Poiché si sta cercando di fare UI operation dal thread di lavoro di AsyncTask questo non sarà mai permesso ..

UPDATE: Se desidera aggiornare qualcosa dal doInBackGround() di AsyncTask utilizzare publishProgress(Progress...) e onProgressUpdate(Progress...).

6

Non è possibile eseguire alcuna GUI su un thread in background. Invece dovresti fare post a Runnable to a handler created in the GUI thread per fare in modo che il tuo toast venga eseguito sul thread corretto.

MODIFICA: poiché il tag dei compiti è stato rimosso, darò uno schema su come farlo;

  • new() up un gestore nel thread della GUI (onCreate è un buon posto) e salvarlo in una variabile membro, ad esempio "gestore".
  • Sposta mostrando il tuo Toast a un Runnable (la classe anonima è piuttosto buona per questo)
  • Per mostrare il brindisi, fai un handler.post() con il Runnable come parametro. Il Runnable verrà eseguito nel thread della GUI.

Per un esempio completo, vedere this article.

+0

per favore aggiungi maggiori dettagli! – user1156210

+0

Aggiornato con alcuni dettagli, buona fortuna. –

+0

Mi dispiace ma ho bisogno di un altro aiuto. Posso creare qualcosa come la mia modifica sulla risposta? – user1156210

Problemi correlati