android.os.NetworkOnMainThreadException处理方案

来源:互联网 发布:淘宝宝贝的营销词 编辑:程序博客网 时间:2024/06/06 14:21

android.os.NetworkOnMainThreadException处理方案

最近在写一个demo时遇到了这个异常android.os.NetworkOnMainThreadException,查询了一些资料才知道,

原来是android 4.0不支持在主线程中访问网络操作。于是按照网上别人说的,new一个Thread,然后发一个消息,用Handler处理

几经周折还是不行,不知道是不是自己这出了什么问题。(有人知道为什么new一个线程来处理不行吗?或者说有什么好的处理方法,求教)

最后,问题终于解决了,用了异步处理。

如下:

package com.example.android_http;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.os.AsyncTask;

public class MyAsync extends AsyncTask<Void, Void, Void>{
 private HttpResponse response;
 private HttpEntity entity;
 @Override
 protected Void doInBackground(Void... params) {
  // TODO Auto-generated method stub
  // 生成一个请求对象
  HttpGet httpGet = new HttpGet("http://www.baidu.com");
  // 生成一个Http客户端对象
  HttpClient client = new DefaultHttpClient();
  InputStream inputStream = null;
  try {
   response = client.execute(httpGet);
   entity = response.getEntity();
   inputStream = entity.getContent();
   BufferedReader reader = new BufferedReader(
     new InputStreamReader(inputStream));
   String result = "";
   String line = "";
   while ((line = reader.readLine()) != null) {
    result = result + line;
   }
   System.out.println(result);
  } catch (ClientProtocolException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } finally {
   try {
    inputStream.close();
   } catch (Exception e2) {
    // TODO: handle exception
    e2.printStackTrace();
   }
  }
  return null;
 }
}

 

package com.example.android_http;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

 private Button button;
 

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  button = (Button) this.findViewById(R.id.request_button);
  button.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    new Thread() {
     public void run() {
      handler.sendEmptyMessage(0);
     };
    }.start();
   }
  });
 }

 Handler handler = new Handler() {
  public void handleMessage(android.os.Message msg) {
   switch(msg.what){
     case 0:
      MyAsync task = new MyAsync();
      task.execute();
      break;
   }
  };
 };
}

原创粉丝点击