2010-11-15 15 views
31

मैं निम्नलिखित कोडAsyncTask और Looper.prepare() त्रुटि

class OverlayTask extends AsyncTask<Void, Void, Void> { 
    @Override 
    public void onPreExecute() { 

     if (sites != null) { 
      myMapView.getOverlays().remove(sites); 
      myMapView.invalidate(); 
      sites = null; 
     } 
    } 

    @Override 
    public Void doInBackground(Void... unused) { 
      grabShipsWithLocation(); 
      return (null); 
    } 

    @Override 
    public void onPostExecute(Void unused) { 
     myMapView.getOverlays().add(sites); 
     myMapView.invalidate(); 
     isLoading = false; 
    } 
} 

कुछ परीक्षण उपकरणों पर ठीक से काम करने लगता है, लेकिन मैं डेव कंसोल पर दिखाई देने वाली त्रुटियों की एक बहुत कुछ देख रहा हूँ कि है। मैं यह काम नहीं कर सकता कि यह Looper.prepare() क्यों और कहां रखा जाए। क्या इसकी आवश्यकता है?

java.lang.ExceptionInInitializerError 
at com.test.appname.FinderMain$1.gotLocation(FinderMain.java:286) 
at com.test.appname.MyLocation$GetLastLocation.run(MyLocation.java:89) 
at java.util.Timer$TimerImpl.run(Timer.java:289) 
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.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421) 
at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421) 
at android.os.AsyncTask.<clinit>(AsyncTask.java:152) 

रूप MyLocation.java

अनुरोध किया
class GetLastLocation extends TimerTask { 
    @Override 
    public void run() { 
     lm.removeUpdates(locationListenerGps); 
     lm.removeUpdates(locationListenerNetwork); 

     Location net_loc=null, gps_loc=null; 
     if(gps_enabled) 
      gps_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
     if(network_enabled) 
      net_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 

     //if there are both values use the latest one 
     if(gps_loc!=null && net_loc!=null){ 
      if(gps_loc.getTime()>net_loc.getTime()) 
       locationResult.gotLocation(gps_loc); 
      else 
       locationResult.gotLocation(net_loc); 
      return; 
     } 

     if(gps_loc!=null){ 
      locationResult.gotLocation(gps_loc); //Line 89 
      return; 
     } 
     if(net_loc!=null){ 
      locationResult.gotLocation(net_loc); 
      return; 
     } 
     locationResult.gotLocation(null); 
    } 
} 
+1

grabShipsWithLocation() क्या करता है? – Falmarri

+1

MyLocation.java:89 क्या रेखा है? अपने स्रोत पर एक टिप्पणी जोड़ें। – blindstuff

+0

क्या आप मुख्य थ्रेड से AsyncTask बना रहे/शुरू कर रहे हैं? – gngr44

उत्तर

95

लंबी कहानी:

AsyncTask आंतरिक रूप से एक Handler उपयोग करता है। एक हैंडलर मूल रूप से Runnables को हैंडलर को दिए गए थ्रेड पर किसी अन्य थ्रेड से Runnables पोस्ट करने की अनुमति देता है, जो AsyncTask के मामले में हमेशा वह धागा है जिसे इसे कहा जाता है। यह केवल उन धागे के लिए काम करता है जिनके पास Looper तैयार है, हालांकि।

अधिक जानकारी के लिए http://developer.android.com/reference/android/os/Handler.html

कम देखते हैं:

सीधे शब्दों में FinderMain$1.gotLocation के लिए हर कॉल या एक Runnable में यह भीतर AsyncTask के निर्माण लपेट, और एक Handler यूआई धागा करने के लिए बाध्य करने के लिए इसे पोस्ट , इस तरह:

class GetLastLocation extends TimerTask { 
    private Handler mHandler = new Handler(Looper.getMainLooper()); 

    @Override 
    public void run() { 
     // ... 
     mHandler.post(new Runnable() { 
      public void run() { 
       locationResult.gotLocation(null); 
      } 
     }); 
     // ... 
    } 
} 
+0

बस स्थानResult.gotLocation (शून्य); नए खंड या उपरोक्त पूरे में? –

+0

या प्रत्येक स्थानResult.gotLocation (सामान) ?? –

+0

सभी कॉल प्राप्त करने के लिए स्थान को यूआई थ्रेड के भीतर होने की आवश्यकता है, जिसका मतलब ऊपर के रूप में रननेबल में है। आप इसके पूरे भाग को भी लपेट सकते हैं, लेकिन ध्यान रखें कि यह आपके यूआई को धीमा कर सकता है, अगर इसका निष्पादन बहुत लंबा लगता है। वैकल्पिक रूप से, आप इस तरह एक रननेबल में getLocation के भीतर AsyncTask निर्माण को भी लपेट सकते हैं। –

18

मैं इस कोशिश की ... यह काम किया, आशा है कि यह तुम्हारी मदद करेगा ..

protected class Asyctast extends AsyncTask<String, Integer, Integer> 
{ 

    @Override 
    protected Integer doInBackground(String... params) { 
     // TODO Auto-generated method stub 


     Log.d("Asynctask", ""+params); 
Looper.prepare(); 

     ImageThumbnailsActivity m = new ImageThumbnailsActivity(); 

      Toast.makeText(ImageThumbnailsActivity.this,""+params ,Toast.LENGTH_SHORT).show(); 
      final Dialog dialog_options = new Dialog(ImageThumbnailsActivity.this); 
      dialog_options.setContentView(R.layout.option); 
      dialog_options.show(); 
     Looper.loop(); 
     return null; 
    }  
} 
+7

यह एक नहीं अच्छा समाधान है, Looper.loop कारण() हमेशा के लिए अवरुद्ध हो जाएगा और धागा कभी नहीं किया होगा। आप Looper.myLooper का उपयोग करना चाहिए करने के लिए()। छोड़ने() इस से बचने के लिए। कि के सिवाय अगर आप थ्रेड से Looper.prepare() कॉल करने के लिए की जरूरत है - AsyncTask के बजाय थ्रेड का उपयोग करें। – Borg8

+1

Looper.loop (निकाला जा रहा) में काम किया मुझे अनंत लूप से बचने के लिए के लिए – jgpATs2w

संबंधित मुद्दे