【问题标题】:Exception in using InputStreamReader for URL reading使用 InputStreamReader 读取 URL 时出现异常
【发布时间】:2020-12-12 04:50:05
【问题描述】:

猜!我正在做一个从 json(weathermapApi) 获取天气的程序。我确实可以从资源中获取所有文本,但 Android Studio 不编译我的项目。例外 InputStreamReader inputStreamReader = new InputStreamReader(con.getInputStream()); 请帮帮我!

 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) 

【问题讨论】:

    标签: java android html api url


    【解决方案1】:

    android.os.NetworkOnMainThreadException

    当应用程序尝试在其主线程上执行网络操作时,会引发此异常。

    你应该使用类似的线程

    Thread thread = new Thread(new Runnable() {
    
        @Override
        public void run() {
            try  {
                //Your code goes here
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
    
    thread.start();
    

    检查您是否在 android manifest.xml 文件中添加了此权限:

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

    有几种解决方案可以避免android.os.NetworkOnMainThreadExceptionlike

    1. Async Task(已弃用)
    2. Intent service and broadcast reciever

    您可以使用以下库:

    1. Volley
    2. retrofit
    3. OKHTTP

    如果你用谷歌搜索,你可以找到很多选项或库来在后台调用 API 并在主线程中提供回调。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      相关资源
      最近更新 更多