20
2014
07

#学习笔记#android.os.NetworkOnMainThreadException

NetworkOnMainThreadException

这个异常,官方是这么解释的

The exception that is thrown when an application attempts to perform a networking operation on its main thread.

This is only thrown for applications targeting the Honeycomb SDK or higher. Applications targeting earlier SDK versions are allowed to do networking on their main event loop threads, but it's heavily discouraged. See the document Designing for Responsiveness.

在主线程中进行net操作,会抛出这个异常。

这只会在高级别的SDK版本中才会抛出这个异常。(这个高级别指的是android 4.0以后的版本)


就是说以前的版本,这个是没有问题的。所以你发现你的软件明明以前好好的,现在确突然不能用了,不要奇怪。大家都在成长嘛。


怎么解决呢?


第一种方法:直接忽视,强制使用。

在MainActivity文件的setContentView(R.layout.activity_main)下面加上如下代码

if (android.os.Build.VERSION.SDK_INT > 9) {

   StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

   StrictMode.setThreadPolicy(policy);

}

都说不推荐使用,其实想想,在低版本中能用,高版本中不能用,升级往往不是往好的方向发展嘛。总不能越长也回去,这多不好。(虽然也有例外的)。


第二种方法:使用Thread、Runnable、Handler (推荐使用)
在Runnable中做HTTP请求,不用阻塞UI线程~

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    this.setContentView(R.layout.share_mblog_view);

    new Thread(runnable).start();

}

 

Handler handler = new Handler(){

    @Override

    public void handleMessage(Message msg) {

        super.handleMessage(msg);

        Bundle data = msg.getData();

        String val = data.getString("value");

        Log.i("mylog","请求结果-->" + val);

    }

}

 

Runnable runnable = new Runnable(){

    @Override

    public void run() {

        //

        // TODO: http request.

        //

        Message msg = new Message();

        Bundle data = new Bundle();

        data.putString("value","请求结果");

        msg.setData(data);

        handler.sendMessage(msg);

    }

}


上面两个解决方法摘自互联网,经实践,有效。

转载:http://www.aitinan.com/4387.html

« 上一篇下一篇 »