首页 > 代码库 > 安卓问题总结( android.os.NetworkOnMainThreadException异常)

安卓问题总结( android.os.NetworkOnMainThreadException异常)

问题描述:

android.os.NetworkOnMainThreadException异常(不要在主线程访问网络资源)

问题分析:

造成这种异常的原因是安卓版本问题(仔细研究错误原因是代码不符合Android规范),网上搜索发现:android3.0版本开始(具体是不是从这个版本开始的,就不深究咯)就强制程序不能在主线程中访问网络,要把访问网络放在独立的线程中。

解决方式:

1、想要忽略这些强制策略问题的话,可以在onCreate()方法里面加上

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()

.detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());

StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()

.detectLeakedSqlLiteObjects().detectLeakedClosableObjects()

.penaltyLog().penaltyDeath().build());

2、放在单独的线程中:(我用的是点击按钮查看网络图片,学习用)

private Bitmap bitmap = null;//全局变量 (我如果放在局部变量中,会提示:不可变的局部变量不能被赋值,懒省事就放到全局变量中咯

按钮监听器:

private final class ButtonListenerEvent implements OnClickListener{
@Override
public void onClick(View v) {
    final String path = imagePath.getText().toString();
    final Handler handler = new Handler(){
    public void handleMessage(Message msg){
        switch (msg.what) {
        case 0:
            imageView.setImageBitmap(bitmap);
            break;
        default:
            break;
        }
    }
};
new Thread(){
    public void run(){
    try {
        byte[] data = ImageService.getImage(path);
        // 设置图像的位图
        bitmap = BitmapFactory.decodeByteArray(data, 0,
        data.length);
        //处理完发送一个空消息
        handler.sendEmptyMessage(0);
    } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Toast.makeText(getApplicationContext(), R.string.error, 1)
            .show();
            }
        }
    }.start();
    }
}


我是安卓新手,如果有不对的地方还请大家多多指导~


安卓问题总结( android.os.NetworkOnMainThreadException异常)