【发布时间】:2014-01-03 03:58:39
【问题描述】:
我已经在这个论坛中寻找 aswer 但没有工作,我正在创建一个 android 应用程序并试图从 asyncTask 中的 locationlistener 获取坐标更新(我的 asyncTask 工作只是为了更新纬度和经度) 虽然主线程通过位置管理器从 asyncTask 获取坐标,并且它昨天工作,今天它不再工作了, 这是我的 asyncTask 代码:
private class LoopMsg extends AsyncTask<String,Void,Void>{
protected Void doInBackground(String... urls){
Looper.prepare();
LocationListener listen = new LocationListener() {
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onLocationChanged(Location loc) {
// TODO Auto-generated method stub
Log.d(TAG,"Latitude :"+String.valueOf(loc.getLatitude()));
Log.d(TAG,"Longitude :"+String.valueOf(loc.getLongitude()));
Glatitude = loc.getLatitude();
Glongitude = loc.getLongitude();
}
};
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 60000, 0, listen);
Looper.loop();
return null;
}
}
请帮助我这里出了什么问题?以及如何解决这个问题?它之前运行良好 第二天我在 Looper.prepare() 遇到了异常 它说每个线程只能创建一个looper,然后我删除Looper.prepare和Looper.loop部分,错误更改变为
*FATAL EXCEPTION: asyncTask #1
*java.lang.RuntimeException: an error occured while executing do in background
我真的不知道为什么,因为我没有在我的 doInBackground 方法中更新 ui 线程
为什么我知道我的应用程序不工作: 1.onLocationChanged 不再调用 2.如果我不使用looper.prepare和looper.loop,应用程序崩溃
我也试过这样:
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 60000, 0, listen, Looper.getMainLooper());
还有这个:
Looper.Mylooper.prepare();
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 60000, 0, listen, Looper.getMyLooper());
但仍然没有运气,应用程序仍然没有运行
这是我在 AsyncTask 中移除 Looper 后得到的 logCat(并且应用总是崩溃)
-Fatal Exception: AsyncTask#2
-java.lang.RuntimeException: An error occured while executing doInBackground()
-at android.os.AsyncTask$3.done(AsyncTask.java:299)
-at java.util.concurrent.FutureTask.finishCompletion(FutureTask.Java:219)
-at java.util.concurrent.FutureTask.run(FutureTask.Java:239)
-at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
-at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
-at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
-at java.lang.Thread.run(Thread.java:838)
-Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
-at android.os.Handler.<init>(Handler.java:197)
-at android.os.Handler.<init>(Handler.java:111)
-at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:199)
-at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:199)
-at android.location.LocationManager.wrapListener(LocationManager.java:822)
-at android.location.LocationManager.requestLocationUpdates(LocationManager.java:835)
-at android.location.LocationManager.requestLocationUpdates(LocationManager.java:432)
-at android.location.ZTEPrivacyLocationManager.requestLocationUpdates(ZTEPrivacyLocationManager.java:107)
-at com.login.absen.MyService$LoopMsg.doInBackground(MyService.java:244)
-at com.login.absen.MyService$LoopMsg.doInBackground(MyService.java:1)
-at android.os.AsyncTask$2.call(AsyncTask.java:287)
-at java.util.concurrent.FutureTask.run(FutureTask.java:234)
-... 4 more
更新
我是客人,我可以将问题简单化 实际上问题是在 (zte n986 - android 4.2) 未调用 onLocationChange 方法,我在另一台设备 (journey - android 2.3.3) 中尝试此代码,行为是相同的,asyncTask 也停止在 Looper.loop 但 onLocationChange 运行方法正在运行,因此位置更新仍在运行
【问题讨论】:
-
你不应该需要
Looper和AsyncTask,AFAIK。发布删除Looper代码时获得的完整异常。 -
正确。如果您已经在使用
AsynTask,则不需要Looper。 -
@codeMagic 和@ChuongPham 如果我移除looper 应用程序将在服务开始运行时立即崩溃,这是为什么呢?
-
因为
AsyncTask需要从主Thread调用。你不应该为此需要AsyncTask。 -
我试过不使用 asyncTask,所以我做了一个方法 protected void updateLoc() {},这个方法包含与 asyncTask 类相同的代码,当然我需要使用 Looper.prepare和 Looper.loop ,问题发生在这里: lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 60000, 0, listen); Looper.loop(); -> 这是到达 Looper.loop 时的问题,应用程序只会一遍又一遍地运行监听器方法,而主线程永远不会完成运行(我将监听器放在应用程序的中间),如何解决这个问题?
标签: android android-asynctask android-location