android(3.1之后)不允许主UI进程网络操作(android.os.NetworkOnMainThreadException异常)

嗯,这里是简介,主题配置内可以修改,如留空则不显示

android(3.1之后)不允许主UI进程网络操作(android.os.NetworkOnMainThreadException异常)

我最开始做Android开发的时候,当时是2010年左右,Android还是2.x版本左右,当时还有我叙述的这个问题,但是我翻看了一下自己曾经的笔记,也有涉及这方面的内容,具体为:Android_解决android.os.NetworkOnMainThreadException异常 ,但是当时Android官方并没有Force Close,只是建议了这个问题,所以当时遇到了,但是没有深层次的考虑这个,也就是为啥建议不要这么用。

当我从新需要开发的时候,Android已经更新到了5.x版本,现在Android官方明确要求不能这么用。

其实原因很简单,由于对于网络状况的不可预见性,很有可能在网络访问的时候造成阻塞,那么这样一来我们的主线程UI线程 就会出现假死的现象,产生很不好的用户体验。所以,默认的情况下如果直接在主线程中访问就报出了这个异常,名字是NetworkOnMainThreadException

解决办法常见有两个(1)独立线程(2)StrictMode修改默认的策略。建议使用建议使用线程完成。

我项目中的部分代码:

/*set login button click listener*/
        login_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                show_textvied.setText("begining");
                Log.v(TAG, "begining");
                /*get name and password*/
                String login_name = name_edittext.getText().toString();
                String login_password = passwort_edittext.getText().toString();
                Log.v(TAG, login_name + "-" + login_password);
                /*new Thread to send post*/
                WorkThread doPostThread = new WorkThread();
                doPostThread.setUsername(login_name);
                doPostThread.setPassword(login_password);
                doPostThread.start();
            }
        });

//工作线程
    private class WorkThread extends Thread {
        private String username;
        private String password;
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        @Override
        public void run() {
            /*sent post to server*/
            Map<String, String> params = new HashMap<String, String>();
            params.put("username", username);
            params.put("password", password);
            String result = HttpUtils.sendPostMessage(params, "utf-8");
            Log.v(TAG, "System-test-logcat");
            Log.v(TAG, result);
            //处理完成后给handler发送消息
            Message msg = new Message();
            msg.what = COMPLETED;
            msg.obj = result;
            handler.sendMessage(msg);
        }
    }


Android的主线程是GUI线程,这个线程一般就是作为操作UI界面的,相关的操作如网络连接等一般放到其他线程,以防止其他操作卡顿导致界面卡顿。

参考资料:
http://blog.csdn.net/thl789/article/details/10628419
http://www.cnblogs.com/lyroge/p/3837902.html


发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Hello world. 豫ICP备16008819号-1.

Power by Z-BlogPHP  Theme by wzdaxue