美文网首页
Android错误集:android.os.NetworkOnM

Android错误集:android.os.NetworkOnM

作者: CoderAPang | 来源:发表于2019-10-16 10:40 被阅读0次

    背景:在写网络连接操作的DEMO示例时,抛出android.os.NetworkOnMainThreadException异常。

    错误原因:查询资料后发现,在主线程中试图进行网络操作会抛出此异常。

    错误代码:

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            try {
                URL url = new URL("https://www.baidu.com");
                HttpURLConnection connection = (HttpURLConnection)url.openConnection();
                connection.setRequestMethod("GET");
    
                connection.setConnectTimeout(8000);
                connection.setReadTimeout(8000);
    
                InputStream in = connection.getInputStream();
                connection.disconnect();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }
    
    

    解决办法:将网络请求等耗时操作放在独立的线程中,主线程通过handler获取数据。

    修改后的代码:

    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener{
        TextView responseText;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button sendRequest =(Button)findViewById(R.id.send_request);
            responseText = (TextView)findViewById(R.id.response_text);
            sendRequest.setOnClickListener(this);
    
        }
    
        @Override
        public void onClick(View view) {
            if(view.getId() ==R.id.send_request){
                sendRequestWithHttpConnection();
            }
        }
    
        private void sendRequestWithHttpConnection(){
            //开启线程发起网络连接
            new Thread(new Runnable(){
                public void run(){
                    HttpURLConnection connection = null;
                    BufferedReader reader = null;
                    try{
                        URL url = new URL("https://www.baidu.com");
                        connection = (HttpURLConnection)url.openConnection();
                        connection.setRequestMethod("GET");
                        connection.setConnectTimeout(8000);
                        connection.setReadTimeout(8000);
                        InputStream in = connection.getInputStream();
                        //下面对获取到的输入流进行读取
                        reader = new BufferedReader(new InputStreamReader(in));
                        StringBuilder response = new StringBuilder();
                        String line;
                        while(null!=(line = reader.readLine())){
                            response.append(line);
                        }
                        showResponse(response.toString());
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }finally {
                        if(reader !=null){
                            try{
                                reader.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                        if(connection!=null){
                            connection.disconnect();
                        }
                    }
                }
            }).start();
        }
    
        private void showResponse(final String response){
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    //在这里进行UI操作
                    responseText.setText(response);
                }
            });
        }
    

    运行结果如下图所示


    image.png

    相关文章

      网友评论

          本文标题:Android错误集:android.os.NetworkOnM

          本文链接:https://www.haomeiwen.com/subject/xmjymctx.html