2013-10-14 25 views
0

我的应用程序在每4-5次调用时崩溃。这是在例外之后向我展示的。AsynchTask:每个线程只能创建一个Looper

10-14 14:00:30.651: E/AndroidRuntime(25035): FATAL EXCEPTION: AsyncTask #1 
10-14 14:00:30.651: E/AndroidRuntime(25035): java.lang.RuntimeException: An error occured while executing doInBackground() 
10-14 14:00:30.651: E/AndroidRuntime(25035): at android.os.AsyncTask$3.done(AsyncTask.java:299) 
10-14 14:00:30.651: E/AndroidRuntime(25035): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
10-14 14:00:30.651: E/AndroidRuntime(25035): at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
10-14 14:00:30.651: E/AndroidRuntime(25035): at java.util.concurrent.FutureTask.run(FutureTask.java:239) 
10-14 14:00:30.651: E/AndroidRuntime(25035): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
10-14 14:00:30.651: E/AndroidRuntime(25035): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
10-14 14:00:30.651: E/AndroidRuntime(25035): at java.lang.Thread.run(Thread.java:838) 
10-14 14:00:30.651: E/AndroidRuntime(25035): Caused by: java.lang.RuntimeException: Only one Looper may be created per thread 
10-14 14:00:30.651: E/AndroidRuntime(25035): at android.os.Looper.prepare(Looper.java:80) 
10-14 14:00:30.651: E/AndroidRuntime(25035): at android.os.Looper.prepare(Looper.java:75) 
10-14 14:00:30.651: E/AndroidRuntime(25035): at com..SplashActivity$LocationUpdator.doInBackground(SplashActivity.java:118) 
10-14 14:00:30.651: E/AndroidRuntime(25035): at com..SplashActivity$LocationUpdator.doInBackground(SplashActivity.java:1) 
10-14 14:00:30.651: E/AndroidRuntime(25035): at android.os.AsyncTask$2.call(AsyncTask.java:287) 
10-14 14:00:30.651: E/AndroidRuntime(25035): at java.util.concurrent.FutureTask.run(FutureTask.java:234) 

这是我的代码。

public class LocationUpdator extends AsyncTask<Void, Void, Location> { 
Location location123 = null; 



@Override 
protected Location doInBackground(Void... arg0) { 

    Looper.prepare(); 
    mThreadLooper = Looper.myLooper();   
    locationListener = new LocationListener() 
    { 
    private String subLocality; 
    @Override 
    public void onLocationChanged(Location location1) { 


     if(mThreadLooper != null) 
      mThreadLooper.quit(); 
     //Stopping Request for Location 
     if(manager!=null) 
      manager.removeUpdates(locationListener); 
    } 

    String status="success"; 


     if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
      // if GPS provider is not enable then popup alertbox 
      buildAlertMessageNoGps(); 
     } else {   
      // if gps is one then start searching      
      status = "networkandgps"; 
      manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000,1000, locationListener); 
     } 
    } 

     manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     Log.i("TEST","Starting Network Provider"); 
     manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5000, 10,locationListener); 
     if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
      //buildAlertMessageNoGps(); 
      ; 
     } else { 
      manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100000,100000,locationListener);    
     } 
    } else {   

     manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5000, 10,locationListener);    
    } 

    Looper.loop(); 
    return location123; 
} 

@Override 
protected void onPostExecute(Location result) { 


    //progressDialog.dismiss(); 
    if(result!=null) 
    {    
     Log.i("TESTING SPLASH","Lat3 "+userLocationLat); 
     Log.i("TESTING SPLASH ","Long3 "+userLocationlong); 

     startApplication();   

    }   

}}

我也尝试戒烟循环中的onStop方法。但没有帮助。我知道在Asynch任务中使用looper很奇怪,但是在Asynch Task的doInBackground方法中还有其他方法可以使用位置侦听器。

请给我暗示为什么我得到这个错误。

+0

从逻辑上说,你不应该在你的'AsyncTask'的** doInBackground **里面使用'Loopers'。如果你这样做,那么你真的需要重新思考你的'AsyncTask'的设计。否则,它会杀死使用这个复杂类的目的。 – waqaslam

回答

0

它的崩溃,因为的AsyncTask的线被用作一个线程池(这意味着它的使用和再利用说,回答的第一个部分是相同的4个或5个线程。!

没有你在一个AsyncTask里面使用Looper,因为Only one Looper may be created per thread

第二个想法是,你为什么使用这个Looper呢?它没有在你的代码中做任何事情,如果你相信因为它,Listener被后台线程调用,我有一个坏消息,它不是!监听器将被调用到它想调用的任何线程中,通常这就是UI线程。如果你想避免长时间运行的进程(比如网络)他的UI线程,你应该从public void onLocationChanged(Location)方法启动一个新线程(或一个新的AsyncTask)。将侦听器代码放入protected Location doInBackground(Void... arg0)内只会让您的代码非常混乱,无法在实际执行中读取。

我希望它有帮助。

编辑:

在搭载Android 4.0(或3.0,不知道)和多达这是一个SingleThreadPool,这使得这个乱用活套越紧一点

相关问题