代码之家  ›  专栏  ›  技术社区  ›  Hybrid Developer

IndexOutOfBounds运行我的android程序时显示异常

  •  0
  • Hybrid Developer  · 技术社区  · 13 年前

    我正在做一个面向Android地图的项目。我写了一些代码来显示两个地方之间的方向,但它只适用于较低的android版本,如2.0、2.2等。它不适用于android 4.0和更高版本。当我在Android 4.0中运行此代码时,它显示 IndexOutOfBoundsException .

    我的课

    import java.io.InputStream;
    import java.util.ArrayList;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.protocol.BasicHttpContext;
    import org.apache.http.protocol.HttpContext;
    import org.w3c.dom.Document;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Point;
    import android.os.Bundle;
    import android.widget.Button;
    import com.google.android.maps.GeoPoint;
    import com.google.android.maps.MapActivity;
    import com.google.android.maps.MapController;
    import com.google.android.maps.MapView;
    import com.google.android.maps.Overlay;
    
    public class LocationActivity extends MapActivity {
            MapView mv;
    
            MapController mc;
    
            Button Save, Cancel;
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.map_places);
                    MapView mv = (MapView)findViewById(R.id.mapView);
                    mv.setBuiltInZoomControls(true);
                    MapController mc = mv.getController();
                    ArrayList<GeoPoint> all_geo_points = getDirections(10.154929, 76.390316, 10.015861, 76.341867);
                    GeoPoint moveTo = all_geo_points.get(0);
                    mc.animateTo(moveTo);
                    mc.setZoom(12);
                    mv.getOverlays().add(new MyOverlay(all_geo_points));
            }
    
            public class MyOverlay extends Overlay {
                    private ArrayList<GeoPoint> all_geo_points;
    
                    public MyOverlay(ArrayList<GeoPoint> allGeoPoints) {
                            super();
                            this.all_geo_points = allGeoPoints;
                    }
    
                    @Override
                    public boolean draw(Canvas canvas, MapView mv, boolean shadow, long when) {
                            super.draw(canvas, mv, shadow);
                            drawPath(mv, canvas);
                            return true;
                    }
    
                    public void drawPath(MapView mv, Canvas canvas) {
                            int xPrev = -1, yPrev = -1, xNow = -1, yNow = -1;
                            Paint paint = new Paint();
                            paint.setColor(Color.BLUE);
                            paint.setStyle(Paint.Style.FILL_AND_STROKE);
                            paint.setStrokeWidth(4);
                            paint.setAlpha(100);
                            if (all_geo_points != null) for (int i = 0; i < all_geo_points.size() - 4; i++) {
                                    GeoPoint gp = all_geo_points.get(i);
                                    Point point = new Point();
                                    mv.getProjection().toPixels(gp, point);
                                    xNow = point.x;
                                    yNow = point.y;
                                    if (xPrev != -1) {
                                            canvas.drawLine(xPrev, yPrev, xNow, yNow, paint);
                                    }
                                    xPrev = xNow;
                                    yPrev = yNow;
                            }
                    }
            }
    
            public static ArrayList<GeoPoint> getDirections(double lat1, double lon1, double lat2, double lon2) {
                    String url = "http://maps.googleapis.com/maps/api/directions/xml?origin=" + lat1 + "," + lon1 + "&destination=" + lat2 + "," + lon2
                                    + "&sensor=false&units=metric";
                    String tag[] = {"lat", "lng"};
                    ArrayList<GeoPoint> list_of_geopoints = new ArrayList<GeoPoint>();
                    HttpResponse response = null;
                    try {
                            HttpClient httpClient = new DefaultHttpClient();
                            HttpContext localContext = new BasicHttpContext();
                            HttpPost httpPost = new HttpPost(url);
                            response = httpClient.execute(httpPost, localContext);
                            InputStream in = response.getEntity().getContent();
                            DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
                            Document doc = builder.parse(in);
                            if (doc != null) {
                                    NodeList nl1, nl2;
                                    nl1 = doc.getElementsByTagName(tag[0]);
                                    nl2 = doc.getElementsByTagName(tag[1]);
                                    if (nl1.getLength() > 0) {
                                            list_of_geopoints = new ArrayList<GeoPoint>();
                                            for (int i = 0; i < nl1.getLength(); i++) {
                                                    Node node1 = nl1.item(i);
                                                    Node node2 = nl2.item(i);
                                                    double lat = Double.parseDouble(node1.getTextContent());
                                                    double lng = Double.parseDouble(node2.getTextContent());
                                                    list_of_geopoints.add(new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6)));
                                            }
                                    } else {
                                            // No points found
                                    }
                            }
                    } catch (Exception e) {
                            e.printStackTrace();
                    }
                    return list_of_geopoints;
            }
    
            @Override
            protected boolean isRouteDisplayed() {
                    // TODO Auto-generated method stub
                    return true;
            }
    }
    

    我的日志

    03-01 19:05:19.180: E/AndroidRuntime(2839): FATAL EXCEPTION: main
    03-01 19:05:19.180: E/AndroidRuntime(2839): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.kodspider.parkon/com.kodspider.parkon.LocationActivity}: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at android.app.ActivityThread.startActivityNow(ActivityThread.java:1900)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:694)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at android.widget.TabHost.setCurrentTab(TabHost.java:358)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:150)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:546)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at android.view.View.performClick(View.java:4084)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at android.view.View$PerformClick.run(View.java:16966)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at android.os.Handler.handleCallback(Handler.java:615)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at android.os.Handler.dispatchMessage(Handler.java:92)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at android.os.Looper.loop(Looper.java:137)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at android.app.ActivityThread.main(ActivityThread.java:4745)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at java.lang.reflect.Method.invokeNative(Native Method)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at java.lang.reflect.Method.invoke(Method.java:511)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at dalvik.system.NativeStart.main(Native Method)
    03-01 19:05:19.180: E/AndroidRuntime(2839): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at java.util.ArrayList.get(ArrayList.java:304)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at com.kodspider.parkon.LocationActivity.onCreate(LocationActivity.java:43)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at android.app.Activity.performCreate(Activity.java:5008)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
    03-01 19:05:19.180: E/AndroidRuntime(2839):     ... 18 more
    
    4 回复  |  直到 13 年前
        1
  •  3
  •   Charlie-Blake    13 年前

    所以,基本上,getDirections()返回一个空的ArrayList,然后您试图访问它的第一个项。

    试着理解为什么你的方法返回一个空集,并解决这个问题。

        2
  •  0
  •   kadrei    13 年前

    你在获得了例外 com.kodspier.parkon.LocationActivity.onCreate(LocationActivity.java:43)

    我认为这是以下代码行:

    ArrayList<GeoPoint> all_geo_points = getDirections(10.154929, 76.390316, 10.015861, 76.341867);
    GeoPoint moveTo = all_geo_points.get(0);
    

    因此,方法getDirections返回一个空数组。 尝试:

     if(all_geo_points.size()>0){
        GeoPoint moveTo = all_geo_points.get(0);
        mc.animateTo(moveTo);
        mc.setZoom(12);
        mv.getOverlays().add(new MyOverlay(all_geo_points));
    }
    
        3
  •  0
  •   Hybrid Developer    13 年前

    我找到了我的问题的答案,对于更高版本的android平台,我们必须使用AsyncTask类作为后台线程

        4
  •  0
  •   Maxim Kolesnikov user3200756    13 年前

    使用以下代码。。。

    public static JSONObject getLocationInfo(String origin, String dest) {
    
    StringBuilder stringBuilder = new StringBuilder();
    
    try {
            origin = origin.replaceAll(" ", "%20");
            dest = dest.replaceAll(" ", "%20");
    
            HttpPost httppost = new HttpPost(
                    "http://maps.googleapis.com/maps/api/directions/json?origin="
                            + origin + "&destination=" + dest + "&sensor=false");
            // http://maps.googleapis.com/maps/api/directions/json?origin=Chicago,IL&destination=Los+Angeles,CA&sensor=false
    
            Log.i("httppost",
                    "http://maps.googleapis.com/maps/api/directions/json?origin="
                            + origin + "&destination=" + dest + "&sensor=false");
    
            HttpClient client = new DefaultHttpClient();
            HttpResponse response;
            stringBuilder = new StringBuilder();
    
            response = client.execute(httppost);
            HttpEntity entity = response.getEntity();
            InputStream stream = entity.getContent();
            int b;
            while ((b = stream.read()) != -1) {
                stringBuilder.append((char) b);
            }
        } catch (ClientProtocolException e) {
    
            Log.i("Ex1", e.getMessage());
    
        } catch (IOException e) {
            Log.i("Ex2", e.getMessage());
        }
    
        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject = new JSONObject(stringBuilder.toString());
    
            Log.i("JSON Length", "" + jsonObject.length());
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
        return jsonObject;
    }
    
    推荐文章