在android中获取位置的AsyncTask出错"无法在未调用looper.prepare()的线程内创建处理程序"

use*_*318 2 gps android

所有

我仔细阅读了本网站上的许多相关问答,但没有任何帮助.这是我的代码,它可以正常使用GPS,但一旦我关闭GPS就出错了.

/**
 * 
 * @author Jimmy Chiang
 * 
 */
public class GetLocationTask extends AsyncTask<Context, Void, Location> {

    private OnLocationListener[] mGpsListeners;
    private Location location;

    private LocationListener locationListener = new LocationListener() {

        @Override
        public void onLocationChanged(Location lo) {
            location = lo;
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub

        }
    };

    public interface OnLocationListener {
        public void onLocationGot(Location location);
    }

    public GetLocationTask setOnLocationListener(
            OnLocationListener... listeners) {
        mGpsListeners = listeners;
        return this;
    }

    @Override
    protected Location doInBackground(Context... params) {


        LocationManager locationManager = (LocationManager) params[0]
                .getSystemService(Context.LOCATION_SERVICE);

        String provider = LocationManager.NETWORK_PROVIDER;
        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {

            provider = LocationManager.GPS_PROVIDER;

        }
        location = locationManager.getLastKnownLocation(provider);

        while (location == null) {

            locationManager.requestLocationUpdates(provider, 1000, 1,locationListener);
        }
        return location;
    }

    @Override
    protected void onPostExecute(Location location) {

        for (OnLocationListener listener : mGpsListeners) {
            listener.onLocationGot(location);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

例外情况显示:

无法在未调用looper.prepare()的线程内创建处理程序

一些帖子显示问题应该在UI线程中调用someting,但我找不到任何这个.非常感谢,如果你知道发生了什么〜

Bla*_*elt 7

更改

locationManager.requestLocationUpdates(provider, 1000, 1,locationListener);
Run Code Online (Sandbox Code Playgroud)

locationManager.requestLocationUpdates(provider, 1000, 1,locationListener, Looper.getMainLooper());
Run Code Online (Sandbox Code Playgroud)

作为文档中的立场

Looper.getMainLooper()
Run Code Online (Sandbox Code Playgroud)

返回应用程序的主循环器,它位于应用程序的主线程中.

requestLocationUpdate的looper参数是一个Looper对象,其消息队列将用于实现回调机制,或null以在调用线程上进行回调.

如果您希望AsyncTask成为将接收您必须使用的消息的那个

  Looper.myLooper().prepare();
  locationManager.requestLocationUpdates(provider, 1000, 1,locationListener, Looper.myLooper());
Run Code Online (Sandbox Code Playgroud)