简体   繁体   English

使用 InputStreamReader 读取 URL 的异常

[英]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类的

  1. Async Task (Which is deprecated) 异步任务(已弃用)
  2. Intent service and broadcast reciever 意图服务和广播接收器

You can Use libraries like:您可以使用以下库:

  1. Volley凌空抽射
  2. retrofit改造
  3. OKHTTP OKHTTP

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM