在android的MapActivity中使用带有线程的URL连接时出错

在android的MapActivity中使用带有线程的URL连接时出错,android,multithreading,google-maps,android-mapview,Android,Multithreading,Google Maps,Android Mapview,我正在使用一个URL连接来连接GoogleMapsWeb服务,并以KML格式获取结果,对其进行解析并将其显示在MapView上。我把这些操作放在一个线程中,但我得到了这个错误,我不知道这意味着什么?! 请帮我找出这个错误是什么,解决方法是什么 09-28 23:00:45.026: ERROR/ActivityManager(67): ANR in com.android.uis (com.android.uis/.RoutingMapActivity) 09-28 23:00:45.026:

我正在使用一个URL连接来连接GoogleMapsWeb服务,并以KML格式获取结果,对其进行解析并将其显示在MapView上。我把这些操作放在一个线程中,但我得到了这个错误,我不知道这意味着什么?! 请帮我找出这个错误是什么,解决方法是什么

09-28 23:00:45.026: ERROR/ActivityManager(67): ANR in com.android.uis (com.android.uis/.RoutingMapActivity)
09-28 23:00:45.026: ERROR/ActivityManager(67): Reason: keyDispatchingTimedOut
09-28 23:00:45.026: ERROR/ActivityManager(67): Load: 0.49 / 0.21 / 0.15
09-28 23:00:45.026: ERROR/ActivityManager(67): CPU usage from 22714ms to 0ms ago:
09-28 23:00:45.026: ERROR/ActivityManager(67):   99% 1049/com.android.uis: 98% user + 0.4% kernel / faults: 159 minor
09-28 23:00:45.026: ERROR/ActivityManager(67):   0.4% 199/com.google.process.gapps: 0.2% user + 0.1% kernel / faults: 52 minor
09-28 23:00:45.026: ERROR/ActivityManager(67):   0.1% 67/system_server: 0% user + 0% kernel
09-28 23:00:45.026: ERROR/ActivityManager(67):   0% 40/adbd: 0% user + 0% kernel
09-28 23:00:45.026: ERROR/ActivityManager(67):   0% 131/com.android.systemui: 0% user + 0% kernel / faults: 1 minor
09-28 23:00:45.026: ERROR/ActivityManager(67): 100% TOTAL: 99% user + 0.7% kernel
09-28 23:00:45.026: ERROR/ActivityManager(67): CPU usage from 996ms to 1566ms later:
09-28 23:00:45.026: ERROR/ActivityManager(67):   91% 1049/com.android.uis: 91% user + 0% kernel / faults: 2 minor
09-28 23:00:45.026: ERROR/ActivityManager(67):     89% 1049/com.android.uis: 89% user + 0% kernel
09-28 23:00:45.026: ERROR/ActivityManager(67):   10% 67/system_server: 5.2% user + 5.2% kernel / faults: 6 minor
09-28 23:00:45.026: ERROR/ActivityManager(67):     8.7% 97/InputDispatcher: 3.5% user + 5.2% kernel
09-28 23:00:45.026: ERROR/ActivityManager(67):     1.7% 68/HeapWorker: 0% user + 1.7% kernel
09-28 23:00:45.026: ERROR/ActivityManager(67): 100% TOTAL: 94% user + 5.2% kernel
MapActivity类

package com.android.uis;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;

import com.android.geo.Road;
import com.android.geo.RoadProvider;
import com.android.maps.MyItemizedOverlay;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

public class RoutingMapActivity extends MapActivity implements LocationListener {

    // Key : 0ObBrVVNjsIA__m7D1lmsednIXg6pcDRBG-Qvfg
    MapView mapView;
    List<Overlay> mapOverlays;
    Drawable drawable;
    Drawable drawable2;
    MyItemizedOverlay itemizedOverlay;
    MyItemizedOverlay itemizedOverlay2;
    LocationManager locationManager;
    private String provider;
    private Road mRoad;
    private Handler mHandler;
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.map_layout);
        initMap();
        //initMyLocation();

    }
    private void initMap(){
        mapView = (MapView) findViewById(R.id.google_maps);
        mapView.setBuiltInZoomControls(true);       
        mapOverlays = mapView.getOverlays();

        new Thread(){


            @Override
            public void run(){
                double fromLat = 49.85, fromLon= 24.016667, toLat = 50.45, toLon = 30.523333;
                String url = RoadProvider.getUrl(fromLat, fromLon, toLat, toLon);
                InputStream is = getConnection(url);
                mRoad = RoadProvider.getRoute(is);
                mHandler.sendEmptyMessage(0);

            }
        }.start();

        mHandler = new Handler(){
            public void handleMessage(Message msg){
                //drawable2 = getResources().getDrawable(R.drawable.marker2);
                drawable = getResources().getDrawable(R.drawable.marker);
                itemizedOverlay2 = new MyItemizedOverlay(drawable, mapView,mRoad);
                mapOverlays.clear();
                for(int i=0; i<mRoad.mRoute.length;i++){
                    addPoint("","",new GeoPoint((int)(mRoad.mRoute[i][1]*1E6),(int)(mRoad.mRoute[i][0]*1E6)),itemizedOverlay2);
                }
                //addPoint("Point 2.","Point 2.",(int)(51.515259*1E6),(int)(-0.086623*1E6),itemizedOverlay2);
                mapOverlays.add(itemizedOverlay2);
                mapView.invalidate();
            };
        };


    }
    private InputStream getConnection(String url){
        InputStream is = null;
        try {
            URLConnection urlConn= new URL(url).openConnection();
            is= urlConn.getInputStream();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return is;
    }
    private void addPoint(String name,String description,GeoPoint point, MyItemizedOverlay myItemizedOverlay){
        OverlayItem overlayItem = new OverlayItem(point,name,description);
        myItemizedOverlay.addOverlay(overlayItem);
    }
    private void initMyLocation(){
        locationManager =(LocationManager)getSystemService(Context.LOCATION_SERVICE);
        Criteria criteria=new Criteria();
        provider = locationManager.getBestProvider(criteria, false);
        Location location = locationManager.getLastKnownLocation(provider);

    }
    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }
    @Override
    public void onLocationChanged(Location arg0) {
        // TODO Auto-generated method stub

    }
    @Override
    public void onProviderDisabled(String arg0) {
        // TODO Auto-generated method stub

    }
    @Override
    public void onProviderEnabled(String arg0) {
        // TODO Auto-generated method stub

    }
    @Override
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
        // TODO Auto-generated method stub

    }

}
package com.android.uis;
导入java.io.IOException;
导入java.io.InputStream;
导入java.net.MalformedURLException;
导入java.net.URL;
导入java.net.URLConnection;
导入java.util.List;
导入android.content.Context;
导入android.graphics.drawable.drawable;
导入android.location.Criteria;
导入android.location.location;
导入android.location.LocationListener;
导入android.location.LocationManager;
导入android.os.Bundle;
导入android.os.Handler;
导入android.os.Message;
导入com.android.geo.Road;
导入com.android.geo.RoadProvider;
导入com.android.maps.MyItemizedOverlay;
导入com.google.android.maps.GeoPoint;
导入com.google.android.maps.MapActivity;
导入com.google.android.maps.MapView;
导入com.google.android.maps.Overlay;
导入com.google.android.maps.OverlayItem;
公共类RoutingMapActivity扩展MapActivity实现LocationListener{
//键:0ObBrVVNjsIA_uuM7D1LMSEDNIXG6PCDRBG-Qvfg
地图视图;
列出地图覆盖图;
可拉伸;
可拉伸2;
MyItemizedOverlay itemizedOverlay;
MyItemizedOverlay ItemizedOverlay 2;
地点经理地点经理;
私有字符串提供者;
私家路;
私人经理人;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.map\u布局);
initMap();
//initMyLocation();
}
私有void initMap(){
mapView=(mapView)findViewById(R.id.google\u地图);
mapView.SetBuilTinZoomControl(真);
mapOverlays=mapView.getOverlays();
新线程(){
@凌驾
公开募捐{
双fromLat=49.85,fromLon=24.016667,toLat=50.45,toLon=30.523333;
字符串url=RoadProvider.getUrl(fromLat、fromLon、toLat、toLon);
InputStream is=getConnection(url);
mRoad=RoadProvider.getRoute(is);
mHandler.sendEmptyMessage(0);
}
}.start();
mHandler=新处理程序(){
公共无效handleMessage(消息消息消息){
//drawable2=getResources().getDrawable(R.drawable.marker2);
drawable=getResources().getDrawable(R.drawable.marker);
itemizedOverlay2=新的MyItemizedOverlay(可绘制、地图视图、mRoad);
mapOverlays.clear();

对于(int i=0;i您可以尝试使用更简单的异步任务,例如:

    private class GetKMLTask extends AsyncTask<String, Integer, String> {
    protected String doInBackground(String... unused) {
        double fromLat = 49.85, fromLon= 24.016667, toLat = 50.45, toLon = 30.523333;
        String url = "";
        InputStream is = getConnection(url);
        //.... get the road here    
        return result;
    }

    protected void onPostExecute(String jsonResult) {
        try {
            drawable = getResources().getDrawable(R.drawable.marker);
            itemizedOverlay2 = new MyItemizedOverlay(drawable, mapView,mRoad);
            mapOverlays.clear();
            for(int i=0; i<mRoad.mRoute.length;i++){
                addPoint("","",new GeoPoint((int)(mRoad.mRoute[i][1]*1E6),(int)(mRoad.mRoute[i][0]*1E6)),itemizedOverlay2);
            }
            //addPoint("Point 2.","Point 2.",(int)(51.515259*1E6),(int)(-0.086623*1E6),itemizedOverlay2);
            mapOverlays.add(itemizedOverlay2);
            mapView.invalidate();
            } 
        catch (Exception e) {
            onFail("");
        }

    }
}
私有类GetKMLTask扩展异步任务{
受保护的字符串背景(字符串…未使用){
双fromLat=49.85,fromLon=24.016667,toLat=50.45,toLon=30.523333;
字符串url=“”;
InputStream is=getConnection(url);
//……到这里来
返回结果;
}
受保护的void onPostExecute(字符串jsonResult){
试一试{
drawable=getResources().getDrawable(R.drawable.marker);
itemizedOverlay2=新的MyItemizedOverlay(可绘制、地图视图、mRoad);
mapOverlays.clear();

对于(int i=0;我不确定如果从后台线程mapOverlays=mapview.getOverlays();访问mapview会发生什么情况;也请参阅本文可能有些事情需要很长时间?
    private class GetKMLTask extends AsyncTask<String, Integer, String> {
    protected String doInBackground(String... unused) {
        double fromLat = 49.85, fromLon= 24.016667, toLat = 50.45, toLon = 30.523333;
        String url = "";
        InputStream is = getConnection(url);
        //.... get the road here    
        return result;
    }

    protected void onPostExecute(String jsonResult) {
        try {
            drawable = getResources().getDrawable(R.drawable.marker);
            itemizedOverlay2 = new MyItemizedOverlay(drawable, mapView,mRoad);
            mapOverlays.clear();
            for(int i=0; i<mRoad.mRoute.length;i++){
                addPoint("","",new GeoPoint((int)(mRoad.mRoute[i][1]*1E6),(int)(mRoad.mRoute[i][0]*1E6)),itemizedOverlay2);
            }
            //addPoint("Point 2.","Point 2.",(int)(51.515259*1E6),(int)(-0.086623*1E6),itemizedOverlay2);
            mapOverlays.add(itemizedOverlay2);
            mapView.invalidate();
            } 
        catch (Exception e) {
            onFail("");
        }

    }
}