2

全て

このサイトで関連する多くの Q&A を注意深く読みましたが、何も役に立ちません。これが私のコードです。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);
        }
    }
}

例外は次のとおりです。

looper.prepare() を呼び出していないスレッド内でハンドラーを作成することはできません

いくつかの投稿は、問題が UI スレッドで何かを呼び出す必要があることを示していますが、私はこれを見つけることができません。詳しい方、よろしくお願いします~

4

1 に答える 1

7

変化する

locationManager.requestLocationUpdates(provider, 1000, 1,locationListener);

locationManager.requestLocationUpdates(provider, 1000, 1,locationListener, Looper.getMainLooper());

ドキュメントにあるように

Looper.getMainLooper()

アプリケーションのメイン スレッドに存在する、アプリケーションのメイン ルーパーを返します。

requestLocationUpdate の looper 引数は、メッセージ キューを使用してコールバック メカニズムを実装する Looper オブジェクト、または呼び出しスレッドでコールバックを作成する null です。

AsyncTask をメッセージを受信するものにしたい場合は、使用する必要があります

  Looper.myLooper().prepare();
  locationManager.requestLocationUpdates(provider, 1000, 1,locationListener, Looper.myLooper());
于 2013-06-15T07:35:59.143 に答える