2016-08-14 52 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