2016-08-14 54 views
0

Lika我在标题中说过,当我想从我的位置获取地址时遇到问题。我不知道问题出在哪里,这是我的堆栈跟踪:从我的位置获取地址android

08-14 18:06:41.035 29629-29629/com.cmn.cmnvtc E/AndroidRuntime:FATAL 例外:主要 过程: com.cmn.cmnvtc,PID:29629 java.lang.IndexOutOfBoundsException:无效索引0,大小为0 at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:260) at java.util.ArrayList.get(ArrayList .java:313) at com.cmn.cmnvtc.Trajetlibre $ 2.onClick(Trajetlibre.java:122) at android.view.View.performClick(View.java:5265) at android.view.View $ PerformClick.run(View.java:21534) at android.os.Handler.handleCallback(Handler.java:815) at android.os.Handler.dispatchMessage(Handler.java:104) at android.os.Looper.loop(Looper.java:207) at android.app.ActivityThread.main(ActivityThread.java:5728) at java.lang.reflect.Method.invoke(Native Method) at com .android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:789) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

和:我的代码的部分地方有问题:

maPosition.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
       Geocoder gc = new Geocoder(getActivity()); 
       getLocation(); 
       List<Address> list = null; 
       try { 
         list = gc.getFromLocation(lat, lng, 1); 
         if (list!= null) { 
           Address returnedAddress = list.get(0); 
           start_address.setText(returnedAddress.getAddressLine(0) + ", " + returnedAddress.getPostalCode() + " " + returnedAddress.getLocality()); 
         } else { 
           start_address.setText("No Address returned!"); 
         } 
       } catch (IOException e) { 
         e.printStackTrace(); 
         start_address.setText("Cannot get address"); 
       } 

     } 
}); 

你能帮助发现问题?

@Poger类似的东西?

maPosition.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       new Thread(new Runnable() { 
        @Override 
        public void run() { 
         Geocoder gc = new Geocoder(getActivity()); 
         List<Address> list = null; 
         try { 
          list = gc.getFromLocation(lat, lng, 1); 
          // start_address.setText(Double.toString(lat)); 
          if(list!= null && !list.isEmpty()) { 
           Address returnedAddress = list.get(0); 
           StringBuilder adressBuilder = new StringBuilder(); 
           adressBuilder.append(returnedAddress.getAddressLine(0) + ", " + returnedAddress.getPostalCode() + " " + returnedAddress.getLocality()); 
           getActivity().runOnUiThread(new Runnable() { 
            @Override 
            public void run() { 
             start_address.setText("No Address returned!"); 
            } 
            //job done on the UI thread 
           }); 
          } 
          else{ 
           getActivity().runOnUiThread(new Runnable() { 
            @Override 
            public void run() { 
             start_address.setText("No Address returned!"); 
            } 
            //job done on the UI thread 
           }); 
          } 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
        } 
       }).start(); 

      } 
     }); 
+0

我不明白你说的所有内容,但是当我运行我的应用程序,并且在点击按钮之前,我关闭了gps,然后打开它,我得到了一个结果。任何想法? – Shadow956

+0

尝试在后台线程中的代码,希望你的问题将得到解决。我做了同样的事情,对我来说工作很好。 –

回答

0

您的代码有两个问题。 让我们来看看documentation of getFromLocation method in Geocoder class。在退货部分中,它指出:

地址对象的列表。返回null空列表如果找不到匹配项或者没有后端服务可用。

你的代码只处理空情况。它不检查返回的列表是否为空。稍后当你打电话给:list.get(0) - 你可能很容易遇到IndexOutOfBoundsException。

的文件也指出:

可能调用从一个线程这种方法从主UI线程分开有用。

它看起来像你从UI线程调用这个方法。正如你所看到的 - 你不应该。你应该在后台线程上调用getFromLocation,然后在UI线程上调用start_address.setText()

所以,首先你应该改变你的代码是这样的:

list = gc.getFromLocation(lat, lng, 1); 
if (list != null && !list.isEmpty()) { 
    Address returnedAddress = list.get(0); 
    //... 

其次,getFromLocation(...)应该在后台线程调用。您可以使用代码可以类似于这样做的:

new Thread(new Runnable() { 
    public void run() { 
     //job done on a background thread, e.g. getFromLocation() call 
    } 
}).start(); 

还有一两件事 - 如果我认为正确的是start_address然后start_address.setText("No Address returned!");应该在UI线程调用的TextView的实例。当在后台线程操作,在Android中的一种方式实现这一目标是通过runOnUiThread() method of Activity class

getActivity().runOnUiThread(new Runnable() { 
    //job done on the UI thread 
}); 

您可以在this article阅读更多关于进程和线程的Android系统。

+0

请问您可以更正我的任何代码吗?我有一个可怜的英语,我不明白你所说的 – Shadow956