应用程序崩溃 - 无法从Web服务返回

时间:2012-06-29 18:04:23

标签: android eclipse web-services google-maps crash

所以我开发了这个应用程序访问设备上的谷歌地图。之后,它会读取设备上可见屏幕的坐标(左上角和右下角),并将值存储在变量xmin xmax ymin和ymax中。现在这些值被传递给Web服务

http://hiscentral.cuahsi.org/webservices/hiscentral_1_1.asmx/GetSeriesCatalogForBox2

以及代码中提到的其他参数,以获取需要在该区域中绘制的注释的坐标。

现在为值硬编码值,例如,

 xmin= -100
    ymin= -99
    xmax= 40
    ymax= 41

程序工作正常,输出是一个解析的xml和注释,但是当我尝试使用角落坐标在地图上可见时,值为,

40338927
-99388178
40347297
-99399164

网络服务没有回复。这会让应用程序崩溃。我不希望它崩溃,但没有任何东西可以表示该区域内没有站点。我怎么能这样做。

请帮助,

提前

thanx

代码:

AndroidTestActivity.java

public class AndroidTestActivity extends MapActivity 
{
/** Called when the activity is first created. */
ArrayList<String> arrlat_long = new ArrayList<String>();
ArrayList<String> arrlat_lat = new ArrayList<String>();
ArrayList<String> d = new ArrayList<String>();
private static final String ACTION_RECV_MSG = "com.imrankhanandroid.intent.action.RECEIVE_MESSAGE";  
private static final String ACTION_OTHER_MSG = "com.imrankhanandroid.intent.action.OTHER_MESSAGE"; 
MapView mapView;
private MessageReceiver receiver ; 
private MapController mapController;
double topLat;
double topLon;
double bottomLat;
double bottomLon;
String strtest,strtest1,strtest2,strtest3;
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


    mapView = (MapView) findViewById(R.id.mapview);
    mapView.setBuiltInZoomControls(true);
    mapController = mapView.getController();
    mapController.setZoom(8);


    Projection proj = mapView.getProjection();  
    GeoPoint topLeft = proj.fromPixels(0, 0);
    GeoPoint bottomRight = proj.fromPixels(mapView.getWidth()-1, mapView.getHeight()-1);
    topLat = topLeft.getLatitudeE6()/1E6;
    topLon = topLeft.getLongitudeE6()/1E6;
    bottomLat = bottomRight.getLatitudeE6()/1E6;
    bottomLon = bottomRight.getLongitudeE6()/1E6;
    int n= ((int) (topLat*1E6));

    int n1= ((int) (topLon*1E6));

    int n2= ((int) (bottomLat*1E6));

    int n3= ((int) (bottomLon*1E6));

    strtest=Integer.toString(n)+"/"+Integer.toString(n1)+"/"+Integer.toString(n2)+"/"+Integer.toString(n3);
    Log.d("strtest strtest", "strtest strtest = "+strtest);
    Intent msgIntent = new Intent(AndroidTestActivity.this,Intentservice.class); 
    msgIntent.putExtra("strtest", strtest);  //arrlat_long
    startService(msgIntent); 




    //Dynamic registration Receiver
    IntentFilter filter = new IntentFilter(ACTION_RECV_MSG);  
    filter.addCategory(Intent.CATEGORY_DEFAULT);  
    receiver = new MessageReceiver();  
    registerReceiver(receiver, filter);  
    IntentFilter filter2 = new IntentFilter(ACTION_OTHER_MSG);  
    filter2.addCategory(Intent.CATEGORY_DEFAULT);  
    receiver = new MessageReceiver();  
    registerReceiver(receiver, filter2);  
}  
  //Broadcast to receive 
public class MessageReceiver extends BroadcastReceiver 
{  
    @Override  
    public void onReceive(Context context, Intent intent) 
    {   
        arrlat_long = intent.getStringArrayListExtra("codnt");  
        arrlat_lat = intent.getStringArrayListExtra("codntlat");  
      // text.setText(message);      
    Toast.makeText(context, arrlat_long.get(0),Toast.LENGTH_SHORT).show();
    testoverlay();
    }  
}  
public void testoverlay()
{
   for(int i=0;i<arrlat_long.size();i++)
   {

        List<Overlay> mapOverlays = mapView.getOverlays();
        Drawable drawable = this.getResources().getDrawable(R.drawable.mapmarker);
        HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable,this);
        float lat = Float.parseFloat(arrlat_lat.get(i));
        float lng = Float.parseFloat(arrlat_long.get(i));
        GeoPoint point = new GeoPoint((int)(lat * 1E6), (int)(lng * 1E6));
        OverlayItem overlayitem = new OverlayItem(point, "", "");
        itemizedoverlay.addOverlay(overlayitem);
        mapOverlays.add(itemizedoverlay);

   }

}
@Override
protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
}
}

HelloItemizedOverlay.java

public class HelloItemizedOverlay extends ItemizedOverlay<OverlayItem>
{
 private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
 private Context mContext;

 public HelloItemizedOverlay(Drawable defaultMarker, Context context)
 {
 super(boundCenterBottom(defaultMarker));
 mContext = context;
 }

 public void addOverlay(OverlayItem overlay)
 {
 mOverlays.add(overlay);
 populate();
 }
 @Override
 protected OverlayItem createItem(int i)
 {
 return mOverlays.get(i);
 }
 @Override
 public int size()
 {
 return mOverlays.size();
 }
 @Override
 protected boolean onTap(int index)
 {

 return true;
 }
}

IntentService.java

public class Intentservice extends IntentService 
{
private static final String ACTION_RECV_MSG = "com.imrankhanandroid.intent.action.RECEIVE_MESSAGE";
private static final String ACTION_OTHER_MSG = "com.imrankhanandroid.intent.action.OTHER_MESSAGE"; 
ArrayList<String> arrlat_long = new ArrayList<String>();
ArrayList<String> arrlat_lat = new ArrayList<String>();
public static String str="";
public static String str1="";
int n=0;
String responseBody;
Integer topLat=0;
Integer topLon=0;
Integer bottomLat=0;
Integer bottomLon=0;
ArrayList<String> a= new ArrayList<String>();
ArrayList<String> b= new ArrayList<String>();
ArrayList<String> c= new ArrayList<String>();
ArrayList<String> d= new ArrayList<String>();
MapView mapView;
private MessageReceiver receiver;


public Intentservice()
{
    super("Intentservice");
    // TODO Auto-generated constructor stub
}

@Override
protected void onHandleIntent(Intent intent) 
{
    String strxmin,xmax,ymin,ymax;
    String str=intent.getExtras().getString("strtest");
    Log.d("onHandleIntent", "onHandleIntent onHandleIntent= "+str);
    String[] arrtelog=str.split("/");
    strxmin=arrtelog[0];
    xmax=arrtelog[1];
    ymin=arrtelog[2];
    ymax=arrtelog[3];

   // strxmin=str;
  //  xmax=str1;
  //  ymin=str2;
  //  ymax=str3;

    // TODO Auto-generated method stub
    HttpClient httpclient = new DefaultHttpClient();   
     String Url = "http://hiscentral.cuahsi.org/webservices/hiscentral_1_1.asmx/GetSeriesCatalogForBox2";
     if(!Url.endsWith("?"))
     {
            Url += "?";
     }

     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(5);   
     nameValuePairs.add(new BasicNameValuePair("xmin",xmax));
     nameValuePairs.add(new BasicNameValuePair("xmax", ymax));
     nameValuePairs.add(new BasicNameValuePair("ymin", "40"));
     nameValuePairs.add(new BasicNameValuePair("ymax", "41"));
     nameValuePairs.add(new BasicNameValuePair("networkIDs", ""));
     nameValuePairs.add(new BasicNameValuePair("conceptKeyword", "precipitation"));
     nameValuePairs.add(new BasicNameValuePair("beginDate", "1/1/2009"));
     nameValuePairs.add(new BasicNameValuePair("endDate", "1/1/2010"));
     String paramString = URLEncodedUtils.format(nameValuePairs, "utf-8");
     Url += paramString;
     try 
        {
           HttpPost httppost = new HttpPost(Url); 
           httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
           HttpResponse response = httpclient.execute(httppost);
           responseBody = EntityUtils.toString(response.getEntity());
           XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
           factory.setValidating(false);
           XmlPullParser myxml = factory.newPullParser();
           InputStream raw = new ByteArrayInputStream(responseBody.getBytes());
           myxml.setInput(raw, null);
           int eventType = myxml.getEventType();

           while(eventType != XmlPullParser.END_DOCUMENT) 
           {
          if(eventType == XmlPullParser.START_DOCUMENT) 
             {

                 Log.d("ParseXmlActivity", "In start document");
             }
             else if(eventType == XmlPullParser.START_TAG) 
             {
                 if (myxml.getName().equals("latitude"))
                    {
                        str="";
                        str  =  myxml.nextText().toString();
                         Log.d("ParseXmlActivity", "In start tag = "+str);
                         arrlat_lat.add(str);
                    }
                    if (myxml.getName().equals("longitude"))
                    {
                        str = myxml.nextText().toString();
                         Log.d("ParseXmlActivity", "In start tag = "+str);
                         arrlat_long.add(str);
                    }

           }

           eventType = myxml.next();

   } }
   catch (XmlPullParserException e) 
   {
   } 
   catch (IOException e)
   {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

     IntentFilter filter = new IntentFilter(ACTION_RECV_MSG); 
     filter.addCategory(Intent.CATEGORY_DEFAULT);  
     receiver = new MessageReceiver();  
     registerReceiver(receiver, filter); 



   Log.d("TEST TESTTEST", "In start TESTTEST = "+arrlat_long.get(0)+" $$$ "+arrlat_long.size());
   Intent broadcastIntent = new Intent();  
   broadcastIntent.setAction(ACTION_RECV_MSG);  
   broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);  
   broadcastIntent.putStringArrayListExtra("codnt", arrlat_long);  //arrlat_long
   broadcastIntent.putStringArrayListExtra("codntlat", arrlat_lat);  //arrlat_lat
   sendBroadcast(broadcastIntent);  
}

log cat是,

    06-29 18:37:18.786: W/dalvikvm(1344): threadid=12: thread exiting with uncaught exception (group=0x409c01f8)
    06-29 18:37:18.796: E/AndroidRuntime(1344): FATAL EXCEPTION: IntentService[Intentservice]
06-29 18:37:18.796: E/AndroidRuntime(1344): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
06-29 18:37:18.796: E/AndroidRuntime(1344):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
06-29 18:37:18.796: E/AndroidRuntime(1344):     at java.util.ArrayList.get(ArrayList.java:304)
06-29 18:37:18.796: E/AndroidRuntime(1344):     at com.imrankhanandroid.Androidtest.Intentservice.onHandleIntent(Intentservice.java:157)
06-29 18:37:18.796: E/AndroidRuntime(1344):     at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
06-29 18:37:18.796: E/AndroidRuntime(1344):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-29 18:37:18.796: E/AndroidRuntime(1344):     at android.os.Looper.loop(Looper.java:137)
06-29 18:37:18.796: E/AndroidRuntime(1344):     at android.os.HandlerThread.run(HandlerThread.java:60)
06-29 18:37:19.086: D/dalvikvm(1344): GC_CONCURRENT freed 168K, 3% free 10132K/10375K, paused 4ms+4ms
06-29 18:37:20.527: E/ActivityThread(1344): Activity com.imrankhanandroid.Androidtest.AndroidTestActivity has leaked IntentReceiver com.imrankhanandroid.Androidtest.AndroidTestActivity$MessageReceiver@412bf4a0 that was originally registered here. Are you missing a call to unregisterReceiver()?
06-29 18:37:20.527: E/ActivityThread(1344): android.app.IntentReceiverLeaked: Activity com.imrankhanandroid.Androidtest.AndroidTestActivity has leaked IntentReceiver com.imrankhanandroid.Androidtest.AndroidTestActivity$MessageReceiver@412bf4a0 that was originally registered here. Are you missing a call to unregisterReceiver()?
06-29 18:37:20.527: E/ActivityThread(1344):     at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:763)
06-29 18:37:20.527: E/ActivityThread(1344):     at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:567)
06-29 18:37:20.527: E/ActivityThread(1344):     at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1043)
06-29 18:37:20.527: E/ActivityThread(1344):     at android.app.ContextImpl.registerReceiver(ContextImpl.java:1030)
06-29 18:37:20.527: E/ActivityThread(1344):     at android.app.ContextImpl.registerReceiver(ContextImpl.java:1024)
06-29 18:37:20.527: E/ActivityThread(1344):     at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:341)
06-29 18:37:20.527: E/ActivityThread(1344):     at com.imrankhanandroid.Androidtest.AndroidTestActivity.onCreate(AndroidTestActivity.java:81)
06-29 18:37:20.527: E/ActivityThread(1344):     at android.app.Activity.performCreate(Activity.java:4465)
06-29 18:37:20.527: E/ActivityThread(1344):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
06-29 18:37:20.527: E/ActivityThread(1344):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
06-29 18:37:20.527: E/ActivityThread(1344):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
06-29 18:37:20.527: E/ActivityThread(1344):     at android.app.ActivityThread.access$600(ActivityThread.java:123)
06-29 18:37:20.527: E/ActivityThread(1344):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
06-29 18:37:20.527: E/ActivityThread(1344):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-29 18:37:20.527: E/ActivityThread(1344):     at android.os.Looper.loop(Looper.java:137)
06-29 18:37:20.527: E/ActivityThread(1344):     at android.app.ActivityThread.main(ActivityThread.java:4424)
06-29 18:37:20.527: E/ActivityThread(1344):     at java.lang.reflect.Method.invokeNative(Native Method)
06-29 18:37:20.527: E/ActivityThread(1344):     at java.lang.reflect.Method.invoke(Method.java:511)
06-29 18:37:20.527: E/ActivityThread(1344):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-29 18:37:20.527: E/ActivityThread(1344):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-29 18:37:20.527: E/ActivityThread(1344):     at dalvik.system.NativeStart.main(Native Method)
06-29 18:37:20.557: E/ActivityThread(1344): Activity com.imrankhanandroid.Androidtest.AndroidTestActivity has leaked IntentReceiver com.imrankhanandroid.Androidtest.AndroidTestActivity$MessageReceiver@412d2f88 that was originally registered here. Are you missing a call to unregisterReceiver()?
06-29 18:37:20.557: E/ActivityThread(1344): android.app.IntentReceiverLeaked: Activity com.imrankhanandroid.Androidtest.AndroidTestActivity has leaked IntentReceiver com.imrankhanandroid.Androidtest.AndroidTestActivity$MessageReceiver@412d2f88 that was originally registered here. Are you missing a call to unregisterReceiver()?
06-29 18:37:20.557: E/ActivityThread(1344):     at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:763)
06-29 18:37:20.557: E/ActivityThread(1344):     at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:567)
06-29 18:37:20.557: E/ActivityThread(1344):     at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1043)
06-29 18:37:20.557: E/ActivityThread(1344):     at android.app.ContextImpl.registerReceiver(ContextImpl.java:1030)
06-29 18:37:20.557: E/ActivityThread(1344):     at android.app.ContextImpl.registerReceiver(ContextImpl.java:1024)
06-29 18:37:20.557: E/ActivityThread(1344):     at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:341)
06-29 18:37:20.557: E/ActivityThread(1344):     at com.imrankhanandroid.Androidtest.AndroidTestActivity.onCreate(AndroidTestActivity.java:85)
06-29 18:37:20.557: E/ActivityThread(1344):     at android.app.Activity.performCreate(Activity.java:4465)
06-29 18:37:20.557: E/ActivityThread(1344):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
06-29 18:37:20.557: E/ActivityThread(1344):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
06-29 18:37:20.557: E/ActivityThread(1344):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
06-29 18:37:20.557: E/ActivityThread(1344):     at android.app.ActivityThread.access$600(ActivityThread.java:123)
06-29 18:37:20.557: E/ActivityThread(1344):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
06-29 18:37:20.557: E/ActivityThread(1344):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-29 18:37:20.557: E/ActivityThread(1344):     at android.os.Looper.loop(Looper.java:137)
06-29 18:37:20.557: E/ActivityThread(1344):     at android.app.ActivityThread.main(ActivityThread.java:4424)
06-29 18:37:20.557: E/ActivityThread(1344):     at java.lang.reflect.Method.invokeNative(Native Method)
06-29 18:37:20.557: E/ActivityThread(1344):     at java.lang.reflect.Method.invoke(Method.java:511)
06-29 18:37:20.557: E/ActivityThread(1344):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-29 18:37:20.557: E/ActivityThread(1344):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-29 18:37:20.557: E/ActivityThread(1344):     at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:2)

如果您收到IndexOutOfBounds例外,那么您正是这样做的。如果您的ArrayList大小为0,则调用<yourlist>.get(0)将会崩溃,因为列表中没有第0项。要解决此问题,只需检查ArrayList以查看它是否为空或类似:

if(arrlat_long != null && arrlat_long.isEmpty() == false)
    Toast.makeText(context, arrlat_long.get(0),Toast.LENGTH_SHORT).show();

或者您可以使用try/catch并捕获IndexOutOfBounds例外并选择忽略它,因为您似乎期望这样。

答案 1 :(得分:2)

作为你的logcat行:

at com.imrankhanandroid.Androidtest.Intentservice.onHandleIntent(Intentservice.java:157)
06-29 18:37:18.796: E/AndroidRuntime(1344):     at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)

表示问题出在IntentService中的onHandleIntent:

Override
protected void onHandleIntent(Intent intent) 
{
    String strxmin,xmax,ymin,ymax;
    String str=intent.getExtras().getString("strtest");
    Log.d("onHandleIntent", "onHandleIntent onHandleIntent= "+str);
    String[] arrtelog=str.split("/");
   if(arrtelog.length >=3)
    {
      strxmin=arrtelog[0];
      xmax=arrtelog[1];
      ymin=arrtelog[2];
      ymax=arrtelog[3];
    }
  else{
     //your code here if array length is 0
   }