2012-01-20 48 views
12

Đôi khi tôi nhận được lỗi crash này trong ứng dụng của tôijava.lang.RuntimeException: Một lỗi đã xảy ra trong khi thực hiện doInBackground()

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

Đây là toàn bộ logcat:

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 

và đây là của tôi .nea mã lớp:

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; 
     } 
} 

Tại sao tôi gặp phải lỗi này? Làm cách nào để giải quyết? Cảm ơn :)

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

Bạn đã đọc tin nhắn chưa? 'Không thể tạo trình xử lý bên trong luồng mà không được gọi là Looper.prepare()' – SLaks

+0

Có, tôi đã đọc nó nhưng tôi không biết cách giải quyết nó! Chỉ cần gọi Looper.prepare trước bánh mì nướng của tôi, và sau đó là Looper.Loop sau nó? – user1156210

Trả lời

1

Bạn đang hiển thị một Toast trong loadFeed được gọi trong doInBackground phần của AsyncTask của bạn. Bạn không nên truy cập vào giao diện người dùng từ đó.

+0

Có cách nào để có một bánh mì nướng nếu try {} của loadFeed() không hoạt động không? – user1156210

26

Điều này có thể do bạn đang cố hiển thị nội dung nào đó trên doInBackground(). doInBackground chạy trong một chuỗi công nhân mà không thể thực hiện bất kỳ công việc giao diện người dùng nào (bao gồm hiển thị Toasts, đó là những gì bạn đang làm). Thay vào đó, tất cả công việc UI nên được thực hiện trên onPostExecute().

+0

cảm ơn câu trả lời của bạn! Giao diện người dùng được thực hiện trên onPostExecute! Tôi chỉ cần ném một bánh mì nướng vào doInBackground nếu có sự cố với kết nối của tôi.Không phải là có thể? – user1156210

1

Tôi nghĩ Trong này đang Toast làm vấn đề cho bạn,

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

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

      } 

Bởi vì bạn đang cố gắng làm UI operation từ sợi nhân của AsyncTask này sẽ không bao giờ cho phép ..

UPDATE: Nếu bạn muốn cập nhật nội dung nào đó từ số doInBackGround() của AsyncTask sử dụng publishProgress(Progress...)onProgressUpdate(Progress...).

6

Bạn không thể thực hiện bất kỳ công việc GUI nào trên chuỗi nền. Thay vào đó, bạn nên post a Runnable to a handler created in the GUI thread để làm cho Bánh mì nướng của bạn thực thi đúng chuỗi.

EDIT: Vì thẻ bài tập về nhà đã bị xóa, tôi sẽ đưa ra một phác thảo cách thực hiện;

  • new() lên Trình xử lý trong chuỗi GUI (onCreate là một nơi tốt) và lưu nó trong biến thành viên, nói "handler".
  • Di chuyển hiển thị Bánh mì nướng của bạn thành Runnable (lớp ẩn danh là khá tốt cho việc này)
  • Để hiển thị bánh mì nướng, hãy thực hiện handler.post() với Runnable dưới dạng tham số. Runnable sẽ thực thi trong luồng GUI.

Để biết ví dụ hoàn chỉnh, hãy xem this article.

+0

vui lòng thêm chi tiết! – user1156210

+0

Cập nhật với một số chi tiết, chúc may mắn. –

+0

i m xin lỗi nhưng tôi cần thêm một số trợ giúp. Tôi có thể tạo nội dung nào đó giống như chỉnh sửa của mình trên câu trả lời không? – user1156210

Các vấn đề liên quan