-1

私は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)
4

3 に答える 3

3

ここで配列のサイズを確認します。

if(arrtelog.length >=3)

この場合の(ほとんど見えない)閉じ括弧の後に、Log.dステートメントを呼び出します。

問題は、変数が3以上のarrlat_long場合にのみArrayListを入力arrtelogすることです。したがって、それより長くない場合は、ArrayListを入力しません。また、get(0)空のリストにaを追加することはできず、LogCatにエラーが発生します。

于 2012-07-02T21:04:16.510 に答える
1

使用する

String k = topLat.toString(); 

それ以外の

String k = String.valueOf(topLat); 
于 2012-06-27T17:59:20.690 に答える
0
int eventType = myxml.getEventType();

試す:

int eventType = Integer.parseInt(myxml.getEventType());
于 2012-06-27T17:19:40.497 に答える