requestLocationUpdates给出错误“无法在未调用Looper.prepare()的线程内创建处理程序

时间:2012-01-27 12:36:58

标签: android

我知道存在这样的问题,但我在这里感到困惑。我使用此代码:

    public class NewWaitAppActivity extends Activity {
    private Handler mHandler;
    @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mHandler = new Handler();
        lcmgr = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
        Thread LocThread = new Thread(mLocationUpdater);
        Log.d("TAG","About to start worker thread");
        LocThread.start();
}

public void startTimer(View v) {
        if (mStartTime == 0L) {
            mStartTime = System.currentTimeMillis();
            mHandler.removeCallbacks(mUpdateTimeTask);
            mHandler.postDelayed(mUpdateTimeTask, 100);
        }
    }

private Runnable mUpdateTimeTask = new Runnable() {
        public void run() {
            final long start = mStartTime;
            long millis = System.currentTimeMillis() - start;
            int seconds = (int) (millis / 1000);
            int minutes = seconds / 60;
            seconds = seconds % 60;

            TextView timer = (TextView) findViewById(R.id.time_elapsed);

            if (seconds < 10) {
                timer.setText("" + minutes + ":0" + seconds);
            } else {
                timer.setText("" + minutes + ":" + seconds);
            }

            mHandler.postDelayed(this, 1000);
        }
    };
LocationListener locationListener = new LocationListener() {

        public void onLocationChanged(Location location) {
          // Called when a new location is found by the network location provider.
          mStopTimer();
        }
};


private Runnable mLocationUpdater = new Runnable(){
        public void run(){

            Log.d("TAG","Inside worker thread");
            lcmgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
    }
};
}

我基本上试图在位置更新时停止主线程的计时器。应用程序甚至无法启动,它在运行时提供上述错误。该错误是由requestLocationUpdates()引起的。好像我无法在onLocationChanged()中调用stopTimer()。我怎么能纠正这个?

3 个答案:

答案 0 :(得分:53)

甚至不需要编写复杂的解决方案:

locationManager.requestLocationUpdates(provider, 5000, 0, mylistener, Looper.getMainLooper());

这样可以正常使用。

答案 1 :(得分:6)

什么时候需要从你创建的线程中调用“lcmgr.requestLocationUpdates(....)”,当它本身是一个基于异步回调的机制时?
只需在你的onCreate()中移动这段代码活动和事情应该可以正常工作。

当你尝试在一个根本不打算循环的线程中创建一个处理程序时(即不调用Looper.prepare的线程,你的堆栈跟踪状态也是如此)。
在这个网站上也可以找到关于这个错误的更多解释。
但是这里也给出了一个很好的解释。
http://www.aviyehuda.com/2010/12/android-multithreading-in-a-ui-environment/

答案 2 :(得分:0)

您无法访问/生成特定于事件线程的事件,也不需要在线程中请求位置更新,而是可以使用服务来实现相同的。