Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 原因:java.lang.RuntimeException:Can';t在未调用Looper.prepare()的线程内创建处理程序_Android_Android Asynctask_Intentservice_Locationlistener - Fatal编程技术网

Android 原因:java.lang.RuntimeException:Can';t在未调用Looper.prepare()的线程内创建处理程序

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):

我正在编写一个程序,每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): 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,因为它是一个后台任务