我是Android编程的新手,我编写了这段代码来解析可见屏幕以获得左上角和右下角的坐标,然后将值传递给web服务,
http://hiscentral.cuahsi.org/webservices/hiscentral.asmx?op=GetSeriesCatalogForBox2
现在,当我传递xmin xmax ymin和ymax的默认值时,应用程序工作正常但是当我使用MapView函数让角落坐下,然后将它们传递给Web服务然后应用程序崩溃。
如果你能帮助我,我真的很感激, 提前谢谢你
AndroidTest.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<Double> pass= new ArrayList<Double>();
ArrayList<Double> d = new ArrayList<Double>();
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;
double degree;
double minutes;
double seconds;
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));*/
d.add(topLat);
d.add(topLon);
d.add(bottomLat);
d.add(bottomLon);
for (int i=0; i<4 ; i++)
{
double value = d.get(i);
if (value <0)
{
value=value*-1;
int y = (int) value;
double rest= value - y;
String min_sec = Double.toString(rest);
String min = min_sec.substring(2,4); /* minutes */
String sec = min_sec.substring(4,6); /* seconds */
minutes = (Double.valueOf(min)) / 60; /* minutes DD */
seconds = Double.valueOf(sec) / 3600;
double value1= y + minutes + seconds;
value1=value1*-1;
pass.add(value1);
}
else
{
int y1 = (int) value;
double rest1= value - y1;
String min_sec1 = Double.toString(rest1);
String min1 = min_sec1.substring(2,4); /* minutes */
String sec1 = min_sec1.substring(4,6); /* seconds */
minutes = (Double.valueOf(min1)) / 60; /* minutes DD */
seconds = Double.valueOf(sec1) / 3600;
double value1= y1 + minutes + seconds;
pass.add(value1);
}
}
double a= pass.get(0);
double b= pass.get(1);
double c= pass.get(2);
double d= pass.get(3);
strtest=Double.toString(a)+"/"+Double.toString(b)+"/"+Double.toString(c)+"/"+Double.toString(d);
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("/");
if(arrtelog.length >=3)
{
strxmin=arrtelog[0];
xmax=arrtelog[1];
ymin=arrtelog[2];
ymax=arrtelog[3];
// 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",ymax));
nameValuePairs.add(new BasicNameValuePair("xmax", "-99"));
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();
}
catch(IndexOutOfBoundsException e)
{
}
// 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);
}
}
}
这是logcat,
07-02 20:32:59.362: E/AndroidRuntime(2372): FATAL EXCEPTION: IntentService[Intentservice]
07-02 20:32:59.362: E/AndroidRuntime(2372): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
07-02 20:32:59.362: E/AndroidRuntime(2372): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
07-02 20:32:59.362: E/AndroidRuntime(2372): at java.util.ArrayList.get(ArrayList.java:304)
07-02 20:32:59.362: E/AndroidRuntime(2372): at com.imrankhanandroid.Androidtest.Intentservice.onHandleIntent(Intentservice.java:159)
07-02 20:32:59.362: E/AndroidRuntime(2372): at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
07-02 20:32:59.362: E/AndroidRuntime(2372): at android.os.Handler.dispatchMessage(Handler.java:99)
07-02 20:32:59.362: E/AndroidRuntime(2372): at android.os.Looper.loop(Looper.java:137)
07-02 20:32:59.362: E/AndroidRuntime(2372): at android.os.HandlerThread.run(HandlerThread.java:60)
07-02 20:32:59.542: D/dalvikvm(2372): GC_CONCURRENT freed 152K, 3% free 10152K/10375K, paused 5ms+23ms
07-02 20:33:00.702: E/ActivityThread(2372): Activity com.imrankhanandroid.Androidtest.AndroidTestActivity has leaked IntentReceiver com.imrankhanandroid.Androidtest.AndroidTestActivity$MessageReceiver@412a0378 that was originally registered here. Are you missing a call to unregisterReceiver()?
07-02 20:33:00.702: E/ActivityThread(2372): android.app.IntentReceiverLeaked: Activity com.imrankhanandroid.Androidtest.AndroidTestActivity has leaked IntentReceiver com.imrankhanandroid.Androidtest.AndroidTestActivity$MessageReceiver@412a0378 that was originally registered here. Are you missing a call to unregisterReceiver()?
07-02 20:33:00.702: E/ActivityThread(2372): at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:763)
07-02 20:33:00.702: E/ActivityThread(2372): at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:567)
07-02 20:33:00.702: E/ActivityThread(2372): at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1043)
07-02 20:33:00.702: E/ActivityThread(2372): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1030)
07-02 20:33:00.702: E/ActivityThread(2372): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1024)
07-02 20:33:00.702: E/ActivityThread(2372): at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:341)
07-02 20:33:00.702: E/ActivityThread(2372): at com.imrankhanandroid.Androidtest.AndroidTestActivity.onCreate(AndroidTestActivity.java:130)
07-02 20:33:00.702: E/ActivityThread(2372): at android.app.Activity.performCreate(Activity.java:4465)
07-02 20:33:00.702: E/ActivityThread(2372): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
07-02 20:33:00.702: E/ActivityThread(2372): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
07-02 20:33:00.702: E/ActivityThread(2372): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
07-02 20:33:00.702: E/ActivityThread(2372): at android.app.ActivityThread.access$600(ActivityThread.java:123)
07-02 20:33:00.702: E/ActivityThread(2372): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
07-02 20:33:00.702: E/ActivityThread(2372): at android.os.Handler.dispatchMessage(Handler.java:99)
07-02 20:33:00.702: E/ActivityThread(2372): at android.os.Looper.loop(Looper.java:137)
07-02 20:33:00.702: E/ActivityThread(2372): at android.app.ActivityThread.main(ActivityThread.java:4424)
07-02 20:33:00.702: E/ActivityThread(2372): at java.lang.reflect.Method.invokeNative(Native Method)
07-02 20:33:00.702: E/ActivityThread(2372): at java.lang.reflect.Method.invoke(Method.java:511)
07-02 20:33:00.702: E/ActivityThread(2372): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-02 20:33:00.702: E/ActivityThread(2372): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-02 20:33:00.702: E/ActivityThread(2372): at dalvik.system.NativeStart.main(Native Method)
07-02 20:33:00.852: E/ActivityThread(2372): Activity com.imrankhanandroid.Androidtest.AndroidTestActivity has leaked IntentReceiver com.imrankhanandroid.Androidtest.AndroidTestActivity$MessageReceiver@412a62d8 that was originally registered here. Are you missing a call to unregisterReceiver()?
07-02 20:33:00.852: E/ActivityThread(2372): android.app.IntentReceiverLeaked: Activity com.imrankhanandroid.Androidtest.AndroidTestActivity has leaked IntentReceiver com.imrankhanandroid.Androidtest.AndroidTestActivity$MessageReceiver@412a62d8 that was originally registered here. Are you missing a call to unregisterReceiver()?
07-02 20:33:00.852: E/ActivityThread(2372): at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:763)
07-02 20:33:00.852: E/ActivityThread(2372): at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:567)
07-02 20:33:00.852: E/ActivityThread(2372): at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1043)
07-02 20:33:00.852: E/ActivityThread(2372): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1030)
07-02 20:33:00.852: E/ActivityThread(2372): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1024)
07-02 20:33:00.852: E/ActivityThread(2372): at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:341)
07-02 20:33:00.852: E/ActivityThread(2372): at com.imrankhanandroid.Androidtest.AndroidTestActivity.onCreate(AndroidTestActivity.java:126)
07-02 20:33:00.852: E/ActivityThread(2372): at android.app.Activity.performCreate(Activity.java:4465)
07-02 20:33:00.852: E/ActivityThread(2372): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
07-02 20:33:00.852: E/ActivityThread(2372): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
07-02 20:33:00.852: E/ActivityThread(2372): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
07-02 20:33:00.852: E/ActivityThread(2372): at android.app.ActivityThread.access$600(ActivityThread.java:123)
07-02 20:33:00.852: E/ActivityThread(2372): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
07-02 20:33:00.852: E/ActivityThread(2372): at android.os.Handler.dispatchMessage(Handler.java:99)
07-02 20:33:00.852: E/ActivityThread(2372): at android.os.Looper.loop(Looper.java:137)
07-02 20:33:00.852: E/ActivityThread(2372): at android.app.ActivityThread.main(ActivityThread.java:4424)
07-02 20:33:00.852: E/ActivityThread(2372): at java.lang.reflect.Method.invokeNative(Native Method)
07-02 20:33:00.852: E/ActivityThread(2372): at java.lang.reflect.Method.invoke(Method.java:511)
07-02 20:33:00.852: E/ActivityThread(2372): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-02 20:33:00.852: E/ActivityThread(2372): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-02 20:33:00.852: E/ActivityThread(2372): at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:3)
您可以在此处检查阵列的大小:
if(arrtelog.length >=3)
在此之后(几乎不可见)关闭括号之后,请拨打Log.d
声明。
问题是,如果arrlat_long
变量是&gt; = 3,则只填充arrtelog
ArrayList,因此如果不是更长,则不填充ArrayList。并且空列表中的get(0)
是不可能的,并导致您在LogCat中出现错误。
答案 1 :(得分:1)
使用
String k = topLat.toString();
而不是
String k = String.valueOf(topLat);
答案 2 :(得分:0)
int eventType = myxml.getEventType();
尝试:
int eventType = Integer.parseInt(myxml.getEventType());