2014-01-16 59 views
0

我有一部分代码从GPS获取数据并将其保存回API。Android JAVA HTTP GET请求 - 带NULL消息的NetworkOnMainThreadException(已解决)

try{ 

     String Lat = URLEncoder.encode(Double.toString(loc.getLatitude()), "UTF-8"); 
     String Lng = URLEncoder.encode(Double.toString(loc.getLongitude()), "UTF-8"); 

     String currentLocationText = "My current location is: " + "Lat = " + Lat + "Lng = " + Lng; 

     Log.d(LOG_TAG, currentLocationText); 

     String urlString = "http://api/?lat="+Lat+"&lng="+Lng; 

      URL url = new URL(urlString); 
      URLConnection conn = url.openConnection(); 
      InputStream is = conn.getInputStream(); 

      StringWriter writer = new StringWriter(); 
      IOUtils.copy(is, writer, "UTF-8"); 
      String theString = writer.toString(); 

      Log.d(LOG_TAG, "Server response: ."+ theString); 
     } catch (Exception e) { 
      Log.d(LOG_TAG, "Exception: "+ e.getMessage()); 
     } 

但在运行时我收到日志:

"Exception: null" 

在我的清单文件我已经把:

<uses-permission android:name="android.permission.INTERNET" /> 

很抱歉,如果它看起来凌乱(异常处理程序)我是PHP开发人员,这是我的第一步:)。

我怎么知道这有什么问题?我可以改进异常消息以了解发生了什么吗?

编辑: 得到了堆栈跟踪

01-16 21:47:14.759: D/MyLocationListener(2041): Exception: null 
01-16 21:47:14.784: D/MyLocationListener(2041): Stack trace: android.os.NetworkOnMainThreadException 
01-16 21:47:14.784: D/MyLocationListener(2041):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1144) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at java.net.InetAddress.getAllByName(InetAddress.java:214) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at libcore.net.http.HttpEngine.connect(HttpEngine.java:311) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:282) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at com.example.gps_tracker.MyLocationListener.onLocationChanged(MyLocationListener.java:44) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:255) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:184) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:200) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at android.os.Looper.loop(Looper.java:176) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at android.app.ActivityThread.main(ActivityThread.java:5419) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at java.lang.reflect.Method.invoke(Method.java:525) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 
01-16 21:47:14.784: D/MyLocationListener(2041):  at dalvik.system.NativeStart.main(Native Method) 

我想我需要阅读并完全理解: How to fix android.os.NetworkOnMainThreadException?

+0

登录异常的完整堆栈跟踪和/或通过与调试代码步骤。 –

+0

@MattBall谢谢。我仍然没有答案,但至少有一些东西阅读:) – NeverEndingQueue

回答

1

您应该使用异步任务完成所有网络任务。目前,你所做的是阻止不允许的ui线程。这就是你遇到错误的原因。

看看这个关于如何使用的AsyncTask:http://developer.android.com/reference/android/os/AsyncTask.html

+0

谢谢,很明显。我没有意识到这一点。 – NeverEndingQueue

+0

只是为了确认。跟随该线程的答案:http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception 这就是说,你提供了什么链接,所有问题都没有了。 – NeverEndingQueue

1

使用的AsyncTask在网络上GET和POST请求