[英]Exception in using InputStreamReader for URL reading
gues!猜! I am doing a program to get weather from json(weathermapApi).
我正在做一个程序来从 json(weathermapApi) 获取天气。 I did function for get all text from resource, but Android Studio don't compile my project.
我确实从资源中获取所有文本的功能,但 Android Studio 不编译我的项目。 Exception on InputStreamReader inputStreamReader = new InputStreamReader(con.getInputStream());
InputStreamReader 异常 inputStreamReader = new InputStreamReader(con.getInputStream()); help me, PLEASE!
请帮帮我!
public String GetString() {
String URL_API= "https://api.openweathermap.org/data/2.5/onecall?lat=52.249137&lon=104.362658&exclude=minutely,daily&appid=8eac3b7a97a56cb537f453eb7a*****";
String s = "Exception of develop";
try {
URL url = new URL(URL_API);
URLConnection con = url.openConnection();
InputStreamReader inputStreamReader = new InputStreamReader(con.getInputStream());
BufferedReader sc = new BufferedReader(inputStreamReader);
while ((s=sc.readLine())!=null) {
s += s + sc.readLine();
}
} catch (IOException e) {
e.printStackTrace();
}
return s;
2020-08-23 18:19:29.549 19308-19308/com.example.teststart1 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.teststart1, PID: 19308 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.teststart1/com.example.teststart1.MainActivity}: android.os.NetworkOnMainThreadException at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2723) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2784) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1523) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:163) at android.app.ActivityThread.main(ActivityThread.java:6238) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:933) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823) Caused by: android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1303) at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:86) at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:74) at java.net.InetAddress.getAllByName(InetAddress.java:752) at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29) at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:187) at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:156) at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:98) at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:346) at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:329) at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:247) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:405) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:243) at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210) at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java) at com.example.teststart1.MainActivity.GetString(MainActivity.java:42) at com.example.teststart1.MainActivity.onCreate(MainActivity.java:33) at android.app.Activity.performCreate(Activity.java:6857) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2676) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2784) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1523) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:163) at android.app.ActivityThread.main(ActivityThread.java:6238) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:933) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
android.os.NetworkOnMainThreadException
This exception is thrown when an application attempts to perform a networking operation on its main thread.当应用程序尝试在其主线程上执行网络操作时会抛出此异常。
You should use threads like你应该使用像
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
//Your code goes here
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
Check that you have added this permission in android manifest.xml file:检查您是否已在 android manifest.xml 文件中添加了此权限:
<uses-permission android:name="android.permission.INTERNET"/>
There are several solutions to avoid android.os.NetworkOnMainThreadException
like有几种解决方案可以避免
android.os.NetworkOnMainThreadException
类的
You can Use libraries like:您可以使用以下库:
If you google it you can find plenty of option or libraries to call API in background and provide call back in Main thread.如果你谷歌它,你可以找到很多选项或库来在后台调用 API 并在主线程中提供回调。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.