1

我关注这篇文章在Android上获取用户当前位置的最简单和最强大的方法是什么?

我有很多关于帖子的问题,但不幸的是我没有足够的声誉在那里回复,所以我必须创建一个单独的帖子。任何不便敬请谅解。

将代码复制并粘贴到我的应用程序中,它适用于我的三星 S2,但不适用于模拟器 (2.3)。

我的问题:

  1. 在模拟器中运行时,代码永远不会到达 onLocationChanged() 方法,而是等待 20 秒(由 timer1 设置的超时)来启动 GetLastLocation 的 run()。为什么?

  2. 现在,GetLastLocation 类的 run() 方法总是被调用,我得到了上面的异常。

    (E/AndroidRuntime(436): android.view.ViewRoot$CalledFromWrongThreadException: 只有创建视图层次结构的原始线程才能触摸它的视图。)。

我猜错误发生在我的代码中:

    public LocationResult locationResult = new LocationResult()
    {
        @Override
        public void gotLocation(final Location location)
        {
            Log.i(LOG_TAG, "gotLocation");
            if (location == null)
            {
                Log.i(LOG_TAG, "Cannot get location");
            }
            else
            {
                Log.i(LOG_TAG, "Lat: " + location.getLatitude() + " Long:" + location.getLongitude());
                tv = (TextView) findViewById(R.id.my_text); // <<< error here!!!
                            tv.setText(lat + "," + lon);
            }
        }
    };

TextView tv 在我的主 Activity 中初始化,它调用MyLocation myLocation = new MyLocation();myLocation.getLocation(this, locationResult);. 设计与帖子的设计相同。我想知道 GetLastLocation 的 run() 是否在另一个线程中被调用?为什么是这样?有没有人有同样的问题?

非常感谢!

4

1 回答 1

1

使用模拟器时,您需要将当前位置设置为它。它可以通过几种不同的方式来完成。把他们看在这里。我认为开始测试的最简单方法是使用telnetandgeo命令。

As you can use findViewById I suppose you are in the inner class of some Activity. So, use the runOnUiThread method to update your views

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        tv = (TextView) findViewById(R.id.my_text); 
        tv.setText(lat + "," + lon);
    }
});

In the sample code, location updates are received through a timer task, that's why it is running in a separate thread.

于 2012-02-20T20:18:49.100 回答