android.os.NetworkOnMainThreadException

来源:互联网 发布:手机淘宝换回默认皮肤 编辑:程序博客网 时间:2024/06/05 15:22

在xml中添加了<switch>控件

为了正常使用开关控件,然后在manifest里面把

android:minSdkVersion="3"改成了14.

然后运行,主程序有个远程验证的机制,一点击就程序出错,看log

android.os.NetworkOnMainThreadException 

错误指向程序的远程验证,仔细检查没错,最近也没修改,没办法度娘呗,
这个错误的意思是Android 4.0 之后不能在主线程中请求HTTP请求,我的程序就是在主线程中调用了http请求

解决方案有两个,一个是使用StrictMode,二是使用线程来操作网络请求。

第一种方法:简单暴力,强制使用,代码修改简单(但是非常不推荐)
在MainActivity文件的setContentView(R.layout.activity_main)下面加上如下代码

 

if(android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = newStrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
}

?
第二种方法就是另起一个线程,将请求网络资源的代码使用Thread去操作。在Runnable中做HTTP请求,不用阻塞UI线程

 

publicvoid onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.main_view);
    newThread(runnable).start();
}
 
Handler handler = newHandler(){
    @Override
    publicvoid handleMessage(Message msg) {
        super.handleMessage(msg);
        Bundle data = msg.getData();
        String val = data.getString("value");
        Log.i(TAG,"请求结果:"+ val);
    }
}
 
Runnable runnable = newRunnable(){
    @Override
    publicvoid run() {
        // TODO: http request.
        Message msg = newMessage();
        Bundle data = newBundle();
        data.putString("value","请求结果");
        msg.setData(data);
        handler.sendMessage(msg);
    }

解决方法参考:http://www.2cto.com/kf/201402/281526.html


0 0
原创粉丝点击