2

我一直在为演示应用程序开发定位服务。我正在为网络和 GPS 设置一个监听器(我知道这可以用一个来完成,但我有非常基本的 java 并且发现这更容易使用)。无论如何,我想注册 GPS 更新并启动计时器,如果我得到修复我想重新启动计时器并继续收听。但是,如果计时器关闭,我想注册网络更新。

到目前为止的问题是当计时器过去时,我尝试使用 mLLocationM.request 在我的 timerTask 的 run() 中注册网络更新 .... 我得到一个异常。

我认为这是一个线程问题,并且正在寻找解决它的最基本方法,以避免陷入处理程序中。

class GpsTimer extends TimerTask{

    @Override
    public void run() {

        Log.d(TAG, "running");

        mLocationM.requestLocationUpdates
            (LocationManager.NETWORK_PROVIDER, 2 * 60 * 1000, 0, mNetworkListener);


    }

}

我认为这就是导致问题的原因

03-17 16:33:38.528: E/AndroidRuntime(29913): FATAL EXCEPTION: Thread-1364
03-17 16:33:38.528: E/AndroidRuntime(29913): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
03-17 16:33:38.528: E/AndroidRuntime(29913):    at android.os.Handler.<init>(Handler.java:121)
03-17 16:33:38.528: E/AndroidRuntime(29913):    at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:183)
03-17 16:33:38.528: E/AndroidRuntime(29913):    at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:183)
03-17 16:33:38.528: E/AndroidRuntime(29913):    at android.location.LocationManager._requestLocationUpdates(LocationManager.java:661)
03-17 16:33:38.528: E/AndroidRuntime(29913):    at android.location.LocationManager.requestLocationUpdates(LocationManager.java:486)
03-17 16:33:38.528: E/AndroidRuntime(29913):    at com.sblyit.finder.LocationService$GpsTimer$1.run(LocationService.java:150)
03-17 16:33:38.528: E/AndroidRuntime(29913):    at java.lang.Thread.run(Thread.java:856)
4

1 回答 1

1

你应该使用

class GpsTimer extends TimerTask {

    @Override
    public void run() {

        Looper.prepare();
        Log.d("", "running");

        mLocationM.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                2 * 60 * 1000, 0, mNetworkListener);

        Looper.loop();

    }

}

为什么不应该使用handler

Handler h = new Handler();

Runnable run = new Runnable() {

    @Override
    public void run() {
        Log.d("", "running");

        mLocationM.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                2 * 60 * 1000, 0, mNetworkListener);

        h.postDelayed(this, 5000); // 5 seconds
    }
};

@Override
protected void onDestroy() {
    h.removeCallbacks(run);
};

它作为TimerTask

    h.post(run);
于 2013-03-17T16:57:25.687 回答