2013-04-26 47 views
0

我想實現Google Places API,但它一直髮送一個java.lang.nullpointerexception。我得到了這個網站的代碼:http://www.androidhive.info/2012/08/android-working-with-google-places-and-maps-tutorial/谷歌地方API返回java..lang.nullpointerexception

從我可以收集我發送到一些谷歌服務器的網址,並得到一個迴應。該響應採用JSON格式,然後將其解析爲我的特定「位置」對象。我認爲在這個分析階段會發生一些事情。在網站中,他們使用了一些中間對象PlacesList,我認爲這是出錯的地方,因爲我不理解它。

PlacesList:

 public class PlacesList implements Serializable { 

    @Key 
    public String status; 

    @Key 
    public List<Locations> results; 

}

谷歌搜索:

 public PlacesList search(double latitude, double longitude, double radius) 
     throws Exception { 

    this._latitude = latitude; 
    this._longitude = longitude; 
    this._radius = radius; 

    try { 

     HttpRequestFactory httpRequestFactory = createRequestFactory(HTTP_TRANSPORT); 
     HttpRequest request = httpRequestFactory 
       .buildGetRequest(new GenericUrl(PLACES_SEARCH_URL)); 
     request.getUrl().put("key", API_KEY); 
     request.getUrl().put("location", _latitude + "," + _longitude); 
     request.getUrl().put("radius", _radius); // in meters 
     request.getUrl().put("sensor", "false"); 


     PlacesList list = request.execute().parseAs(PlacesList.class); 
     Log.i("placelist.class", list.toString()); 
     // Check log cat for places response status 
     // Log.i("Places Status", "" + list.status); 

     return list; 

    } catch (HttpResponseException e) { 
     Log.e("Error:", e.getMessage()); 
     return null; 
    } 

} 

從MainActivity System.err的(6447):atcom.example.mapmapagain.MainActivity.onCreate( MainActivity.java:86)==

   try { 
     PlacesList places = ps.search(curr_lat, curr_longitude, 100.0); 
    } catch (Exception e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 

這裏是logcat的:

   04-26 19:10:52.839: W/System.err(4156): android.os.NetworkOnMainThreadException 
       04-26 19:10:52.899: W/System.err(4156): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 
       04-26 19:10:52.899: W/System.err(4156): at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
       04-26 19:10:52.899: W/System.err(4156): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
       04-26 19:10:52.899: W/System.err(4156): at java.net.InetAddress.getAllByName(InetAddress.java:214) 
       04-26 19:10:52.899: W/System.err(4156): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70) 
       04-26 19:10:52.899: W/System.err(4156): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
       04-26 19:10:52.899: W/System.err(4156): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340) 
       04-26 19:10:52.899: W/System.err(4156): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 
       04-26 19:10:52.899: W/System.err(4156): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
       04-26 19:10:52.899: W/System.err(4156): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316) 
       04-26 19:10:52.899: W/System.err(4156): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:461) 
      04-26 19:10:52.899: W/System.err(4156): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433) 
      04-26 19:10:52.899: W/System.err(4156): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290) 
      04-26 19:10:52.899: W/System.err(4156): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240) 
      04-26 19:10:52.899: W/System.err(4156): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:81) 
      04-26 19:10:52.899: W/System.err(4156): at libcore.net.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:165) 
      04-26 19:10:52.899: W/System.err(4156): at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:88) 
      04-26 19:10:52.899: W/System.err(4156): at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:814) 
      04-26 19:10:52.909: W/System.err(4156): at com.example.mapmapagain.PlaceSearch.search(PlaceSearch.java:64) 
      04-26 19:10:52.909: W/System.err(4156): at com.example.mapmapagain.MainActivity.onCreate(MainActivity.java:86) 
      04-26 19:10:52.909: W/System.err(4156): at android.app.Activity.performCreate(Activity.java:5104) 
      04-26 19:10:52.909: W/System.err(4156): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
      04-26 19:10:52.909: W/System.err(4156): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
      04-26 19:10:52.909: W/System.err(4156): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
      04-26 19:10:52.909: W/System.err(4156): at android.app.ActivityThread.access$600(ActivityThread.java:141) 
      04-26 19:10:52.909: W/System.err(4156): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
      04-26 19:10:52.909: W/System.err(4156): at android.os.Handler.dispatchMessage(Handler.java:99) 
      04-26 19:10:52.909: W/System.err(4156): at android.os.Looper.loop(Looper.java:137) 
      04-26 19:10:52.909: W/System.err(4156): at android.app.ActivityThread.main(ActivityThread.java:5039) 
      04-26 19:10:52.909: W/System.err(4156): at java.lang.reflect.Method.invokeNative(Native Method) 
      04-26 19:10:52.909: W/System.err(4156): at java.lang.reflect.Method.invoke(Method.java:511) 
      04-26 19:10:52.909: W/System.err(4156): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
      04-26 19:10:52.909: W/System.err(4156): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
      04-26 19:10:52.909: W/System.err(4156): at dalvik.system.NativeStart.main(Native Method) 

感謝您的幫助。

+0

你在模擬器上工作嗎? – ACengiz 2013-04-26 20:09:48

+0

請發佈確切的堆棧跟蹤和其他所有內容 – cbrulak 2013-04-26 20:10:46

+0

您能映射粘貼的代碼和行號嗎?就像Activity.java:5104 ==「PlacesList list = request.execute()。parseAs(PlacesList.class);」 ? – cbrulak 2013-04-26 20:21:20

回答

1

您正在主UI線程上進行網絡連接,現在被Android框架禁止,如您的android.os.NetworkOnMainThreadException例外所示。

這是被禁止的,因爲想象您的服務器無法訪問或者您的用戶的Internet連接速度非常慢。當程序啓動你的功能時,UI將被完全凍結,直到它返回,因爲UI線程將忙於嘗試聯繫該服務器。

將您的搜索功能放在AsyncTask中,或將其包裝在Runnable中,以便它在自己的線程中執行。看看這個問題的一個很好的例子AsyncTask Android example

+0

非常感謝。這很有道理。我沒有意識到爲什麼AsyncTask之前很荒謬。 – KarlCobb 2013-04-26 23:38:56

+0

這將是非常值得您學習的!請將答案標記爲已接受,如果它解決了您的問題,謝謝 – chopchop 2013-04-26 23:40:00

相關問題