Android 原因:java.lang.RuntimeException:Can';t在未调用Looper.prepare()的线程内创建处理程序
我正在编写一个程序,每5分钟获取用户当前的纬度和经度。我使用的是Android 原因:java.lang.RuntimeException:Can';t在未调用Looper.prepare()的线程内创建处理程序,android,android-asynctask,intentservice,locationlistener,Android,Android Asynctask,Intentservice,Locationlistener,我正在编写一个程序,每5分钟获取用户当前的纬度和经度。我使用的是AlarmManager,我想运行程序后台,因此我使用的是IntentService。但执行程序时出现以下错误: logcat 02-06 15:40:03.101: W/dalvikvm(17499): threadid=12: thread exiting with uncaught exception (group=0x4203c2a0) 02-06 15:40:03.109: E/AndroidRuntime(17499):
AlarmManager
,我想运行程序后台,因此我使用的是IntentService
。但执行程序时出现以下错误:
logcat
02-06 15:40:03.101: W/dalvikvm(17499): threadid=12: thread exiting with uncaught exception (group=0x4203c2a0)
02-06 15:40:03.109: E/AndroidRuntime(17499): java.lang.RuntimeException: An error occured while executing doInBackground()
02-06 15:40:03.109: E/AndroidRuntime(17499): at android.os.AsyncTask$3.done(AsyncTask.java:299)
02-06 15:40:03.109: E/AndroidRuntime(17499): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
02-06 15:40:03.109: E/AndroidRuntime(17499): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
02-06 15:40:03.109: E/AndroidRuntime(17499): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
02-06 15:40:03.109: E/AndroidRuntime(17499): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
02-06 15:40:03.109: E/AndroidRuntime(17499): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
02-06 15:40:03.109: E/AndroidRuntime(17499): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
02-06 15:40:03.109: E/AndroidRuntime(17499): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
02-06 15:40:03.109: E/AndroidRuntime(17499): at java.lang.Thread.run(Thread.java:856)
02-06 15:40:03.109: E/AndroidRuntime(17499): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
02-06 15:40:03.109: E/AndroidRuntime(17499): at android.os.Handler.<init>(Handler.java:121)
02-06 15:40:03.109: E/AndroidRuntime(17499): at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:180)
02-06 15:40:03.109: E/AndroidRuntime(17499): at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:180)
02-06 15:40:03.109: E/AndroidRuntime(17499): at android.location.LocationManager._requestLocationUpdates(LocationManager.java:657)
02-06 15:40:03.109: E/AndroidRuntime(17499): at android.location.LocationManager.requestLocationUpdates(LocationManager.java:482)
02-06 15:40:03.109: E/AndroidRuntime(17499): at com.gpsshoppe.LocationFinder$CurrentLocatioFinder.doInBackground(LocationFinder.java:58)
02-06 15:40:03.109: E/AndroidRuntime(17499): at com.gpsshoppe.LocationFinder$CurrentLocatioFinder.doInBackground(LocationFinder.java:1)
02-06 15:40:03.109: E/AndroidRuntime(17499): at android.os.AsyncTask$2.call(AsyncTask.java:287)
02-06 15:40:03.109: E/AndroidRuntime(17499): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
02-06 15:40:03.109: E/AndroidRuntime(17499): ... 5 more
02-06 15:40:03.101:W/dalvikvm(17499):threadid=12:线程退出时出现未捕获异常(组=0x4203c2a0)
02-06 15:40:03.109:E/AndroidRuntime(17499):java.lang.RuntimeException:执行doInBackground()时出错
02-06 15:40:03.109:E/AndroidRuntime(17499):在android.os.AsyncTask$3.done(AsyncTask.java:299)
02-06 15:40:03.109:E/AndroidRuntime(17499):位于java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
02-06 15:40:03.109:E/AndroidRuntime(17499):位于java.util.concurrent.FutureTask.setException(FutureTask.java:124)
02-06 15:40:03.109:E/AndroidRuntime(17499):在java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
02-06 15:40:03.109:E/AndroidRuntime(17499):在java.util.concurrent.FutureTask.run(FutureTask.java:137)
02-06 15:40:03.109:E/AndroidRuntime(17499):在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
02-06 15:40:03.109:E/AndroidRuntime(17499):位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
02-06 15:40:03.109:E/AndroidRuntime(17499):位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
02-06 15:40:03.109:E/AndroidRuntime(17499):在java.lang.Thread.run(Thread.java:856)
02-06 15:40:03.109:E/AndroidRuntime(17499):原因:java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
02-06 15:40:03.109:E/AndroidRuntime(17499):位于android.os.Handler.(Handler.java:121)
02-06 15:40:03.109:E/AndroidRuntime(17499):在android.location.LocationManager$ListenerTransport$1。(LocationManager.java:180)
02-06 15:40:03.109:E/AndroidRuntime(17499):在android.location.LocationManager$ListenerTransport。(LocationManager.java:180)
02-06 15:40:03.109:E/AndroidRuntime(17499):在android.location.LocationManager.\u请求LocationUpdate(LocationManager.java:657)
02-06 15:40:03.109:E/AndroidRuntime(17499):在android.location.LocationManager.RequestLocationUpdate(LocationManager.java:482)
02-06 15:40:03.109:E/AndroidRuntime(17499):在com.gpsshoppe.LocationFinder$CurrentLocatioFinder.doInBackground(LocationFinder.java:58)
02-06 15:40:03.109:E/AndroidRuntime(17499):在com.gpsshoppe.LocationFinder$CurrentLocatioFinder.doInBackground(LocationFinder.java:1)
02-06 15:40:03.109:E/AndroidRuntime(17499):在android.os.AsyncTask$2.call(AsyncTask.java:287)
02-06 15:40:03.109:E/AndroidRuntime(17499):位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
02-06 15:40:03.109:E/AndroidRuntime(17499):。。。还有5个
这是我的课
import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import com.google.android.gms.maps.model.LatLng;
public class LocationFinder extends IntentService {
private Context mcontext;
SharedPreferences shprefs;
public LocationFinder() {
super("LocationFinder");
this.mcontext=this;
// TODO Auto-generated constructor stub
}
@Override
protected void onHandleIntent(Intent intent) {
// TODO Auto-generated method stub
CurrentLocatioFinder lFinder=new CurrentLocatioFinder();
lFinder.execute();
}
public class CurrentLocatioFinder extends AsyncTask<String, String, String> implements LocationListener{
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
LocationManager locationManager = (LocationManager) mcontext.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
return null;
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
if(location!=null){
shprefs=PreferenceManager.getDefaultSharedPreferences(LocationFinder.this);
double latitude=location.getLatitude();
Log.i("Inside cLocation", ""+latitude);
Editor edit=shprefs.edit();
edit.putString("Ltd", ""+latitude);
edit.commit();
double longitude=location.getLongitude();
edit.putString("Lngtd", ""+longitude);
edit.commit();
LatLng lng=new LatLng(latitude,longitude);
Log.i("LatLng", ""+lng);
}
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}
}
导入android.app.IntentService;
导入android.content.Context;
导入android.content.Intent;
导入android.content.SharedReferences;
导入android.content.SharedReferences.Editor;
导入android.location.location;
导入android.location.LocationListener;
导入android.location.LocationManager;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.preference.PreferenceManager;
导入android.util.Log;
导入com.google.android.gms.maps.model.LatLng;
公共类LocationFinder扩展了IntentService{
私有上下文;
共享参考文献;
公共位置查找器(){
超级(“定位查找器”);
this.mcontext=this;
//TODO自动生成的构造函数存根
}
@凌驾
受保护的手部内容无效(意图){
//TODO自动生成的方法存根
CurrentLocatioFinder lFinder=新的CurrentLocatioFinder();
lFinder.execute();
}
公共类CurrentLocationOfInder扩展AsyncTask实现LocationListener{
@凌驾
受保护的字符串doInBackground(字符串…参数){
//TODO自动生成的方法存根
LocationManager LocationManager=(LocationManager)mcontext.getSystemService(Context.LOCATION\u服务);
locationManager.RequestLocationUpdate(locationManager.NETWORK\u提供程序,0,0,此);
返回null;
}
@凌驾
已更改位置上的公共无效(位置){
//TODO自动生成的方法存根
如果(位置!=null){
shprefs=PreferenceManager.getDefaultSharedReferences(LocationFinder.this);
双纬度=location.getLatitude();
Log.i(“内部闭合”,“纬度+纬度”);
Editor edit=shprefs.edit();
编辑.putString(“有限公司”、“纬度”);
edit.commit();
double longitude=location.getLongitude();
edit.putString(“Lngtd”,“经度+”);
edit.commit();
LatLng=新LatLng(纬度、经度);
Log.i(“LatLng”和“+lng”);
}
}
@凌驾
公共无效onProviderDisabled(字符串提供程序){
//TODO自动生成的方法存根
}
@凌驾
公共无效onProviderEnabled(字符串提供程序){
//TODO自动生成的方法存根
}
@凌驾
public void onStatusChanged(字符串提供程序、int状态、Bundle extra){
//TODO自动生成的方法存根
}
}
}
您已经在AsyncTask实现中为locationservice定义了回调处理程序。处理程序将在创建它的线程中执行,因此在您的情况下,位置回调需要从AsyncTask线程执行,而这是它无法执行的。我建议您将locationservice处理程序移动到主线程。
让LocationFinder实现LocationListener接口。我只是编辑了你的类,希望这对你有用
public class LocationFinder extends IntentService {
private Context mcontext;
SharedPreferences shprefs;
public LocationFinder() {
super("LocationFinder");
this.mcontext = this;
// TODO Auto-generated constructor stub
}
@Override
protected void onHandleIntent(Intent intent) {
CurrentLocatioFinder mCurrentLocatioFinder = new CurrentLocatioFinder();
mCurrentLocatioFinder.attach();
}
public class CurrentLocatioFinder implements LocationListener {
LocationManager locationManager;
public void attach() {
locationManager = (LocationManager) mcontext.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
if (location != null) {
shprefs = PreferenceManager.getDefaultSharedPreferences(LocationFinder.this);
double latitude = location.getLatitude();
Log.i("Inside cLocation", "" + latitude);
Editor edit = shprefs.edit();
edit.putString("Ltd", "" + latitude);
edit.commit();
double longitude = location.getLongitude();
edit.putString("Lngtd", "" + longitude);
edit.commit();
LatLng lng = new LatLng(latitude, longitude);
Log.i("LatLng", "" + lng);
}
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}
}
您不能在OnHandleContent中创建AsyncTask,因为它是一个后台任务