注册监听器问题

时间:2013-03-17 16:48:24

标签: android networking gps location timertask

我一直致力于演示应用程序的位置服务。我正在建立一个网络和GPS的监听器(我知道这可以用一个,但我非常基本的java,并发现这更容易使用)。无论如何,我想注册GPS更新并启动计时器如果我得到一个修复我想重新启动计时器并继续听。但是,如果计时器熄灭,我想注册网络更新。

到目前为止的问题是计时器过去了,我尝试使用mLocationM.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)

1 个答案:

答案 0 :(得分: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);