0

我正在开发一个 android 应用程序。在我的活动中,我使用以下代码。

LocationResult locationResult = new LocationResult(){

        @Override
        public void gotLocation(Location location){
            //Got the location!




            Drawable marker = getResources().getDrawable(
                    R.drawable.currentlocationmarker);//android.R.drawable.btn_star_big_on
            int markerWidth = marker.getIntrinsicWidth();
            int markerHeight = marker.getIntrinsicHeight();
            marker.setBounds(0, markerHeight, markerWidth, 0);
            MyItemizedOverlay myItemizedOverlay = new MyItemizedOverlay(marker);
            currentmarkerPoint = new GeoPoint((int) (location.getLatitude() * 1E6),
                    (int) (location.getLongitude() * 1E6));

            currLocation = location;

            mBlippcoordinate = currentmarkerPoint;
            mBlippLocation = location;
            myItemizedOverlay.addItem(currentmarkerPoint, "", "");

            mBlippmapview.getOverlays().add(myItemizedOverlay);
            animateToCurrentLocation(currentmarkerPoint);


        }
    };


    MyLocation myLocation = new MyLocation();
    myLocation.getLocation(this, locationResult);

我正在使用上面的代码从 gps 或网络中查找位置。该animateToCurrentLocation(currentmarkerPoint);方法包含一个异步任务。所以我得到

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

提前致谢。

4

1 回答 1

3

当您尝试从没有附加 Looper 的线程创建和运行 AsyncTask 时,您会收到此错误。AsyncTasks 需要一个 Looper 来将其“任务完成”消息发布回启动 AsyncTask 的线程。

现在你真正的问题是:如何使用 Looper 获取线程?事实证明你已经有了一个:主线程。正如文档还指出的那样,您应该从主线程创建并 .execute() 您的 AsyncTask。然后 doInBackground() 将在工作线程(来自 AsyncTask 线程池)上运行,您可以在那里访问网络。在通过主线程的 Handler/Looper 将 onPostExecute() 发布到主线程之后,它将在主线程上运行。

于 2012-12-05T11:18:02.103 回答