所以我开发了这个应用程序访问设备上的谷歌地图。之后,它会读取设备上可见屏幕的坐标(左上角和右下角),并将值存储在变量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)
答案 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
}