android.os.NetworkOnMainThreadException异常处理

这个异常情况是在访问网络的时候如果你把操作放在了Activity的主线程当中的话就会产生,并且导致访问网络失败。

在Android2.3之后才会有这个问题,主要是为了防止网络操作阻塞UI线程。

package com.example.asynctask_download;

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

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {
	private Button button1 = null;
	private ImageView imageView1 = null;
	private String imagePath = "http://img1.gtimg.com/news/pics/hv1/229/20/1529/99428554.jpg";
	private Bitmap bitmap = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		button1 = (Button)findViewById(R.id.button1);
		imageView1 = (ImageView)findViewById(R.id.imageView1);
		button1.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				//HttpClient用于发起GET或者POST请求
				HttpClient httpClient = new DefaultHttpClient();
				//创建HttpGet或HttpPost对象,将要请求的URL通过构造方法传入HttpGet或HttpPost对象。
				HttpGet httpGet = new HttpGet(imagePath);
				try{
					//发起GET请求第2步:使用execute方法发送HTTP,GET请求,并返回HttpResponse对象  
					HttpResponse httpResponse= httpClient.execute(httpGet);
					//判断请求响应状态码,状态码为200表示服务端成功响应了客户端的请求 
					if(httpResponse.getStatusLine().getStatusCode() == 200){
					//HttpEntity实体类  即可以是流也可以是字符串形式。 下面是一个流的形式
						HttpEntity  httpEntity  = httpResponse.getEntity();
						
						byte data[] = EntityUtils.toByteArray(httpEntity);
						
						bitmap = BitmapFactory.decodeByteArray(data,0,data.length);
						
						imageView1.setImageBitmap(bitmap);
					}
				}catch(Exception e){
					e.printStackTrace();
				}
				
			}
		});
		
	}
} 

上面的程序要从网络上下载一张图片到手机屏幕上面,没有开新的线程或者使用异步任务类出现警告并且访问失败

02-25 14:44:44.222: W/System.err(21134): android.os.NetworkOnMainThreadException


package com.example.asynctask_download;

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

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {
	private Button button1 = null;
	private ImageView imageView1 = null;
	private String imagePath = "http://img1.gtimg.com/news/pics/hv1/229/20/1529/99428554.jpg";
	private ProgressDialog dialog = null;
	private Bitmap bitmap = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		button1 = (Button)findViewById(R.id.button1);
		imageView1 = (ImageView)findViewById(R.id.imageView1);
		dialog = new ProgressDialog(this);
		dialog.setTitle("提示信息");
		dialog.setMessage("正在下载,请稍后......");
		button1.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				new MyTask().execute(imagePath);
			}
		});
		
	}

	/**
	 * 使用异步任务的规则
	 * 1.声明一个类继承AsyncTask,标注三个参数的类型
	 * 2.第一个参数表示 我们要执行的任务,通常是网络路径
	 * 3.第二个参数表示进入的刻度
	 * 4.第三个参数表示任务执行的返回结果
	 * @author Administrator
	 *
	 */
	public class MyTask extends AsyncTask<String,Void,Bitmap>{
		//表示任务执行之前的操作
		@Override
		protected void onPreExecute() {
			// TODO Auto-generated method stub
			super.onPreExecute();
			dialog.show();
		}
		
		//主要是完成耗时操作
		@Override
		protected Bitmap doInBackground(String... params) {
			//通常使用网络连接类HttpClient类完成对网络数据的提取
			//HttpClient用于发起GET或者POST请求
			HttpClient httpClient = new DefaultHttpClient();
			//创建HttpGet或HttpPost对象,将要请求的URL通过构造方法传入HttpGet或HttpPost对象。
			HttpGet httpGet = new HttpGet(imagePath);
			try{
				//发起GET请求第2步:使用execute方法发送HTTP,GET请求,并返回HttpResponse对象  
				HttpResponse httpResponse= httpClient.execute(httpGet);
				//判断请求响应状态码,状态码为200表示服务端成功响应了客户端的请求 
				if(httpResponse.getStatusLine().getStatusCode() == 200){
				//HttpEntity实体类  即可以是流也可以是字符串形式。 下面是一个流的形式
					HttpEntity  httpEntity  = httpResponse.getEntity();
					
					byte data[] = EntityUtils.toByteArray(httpEntity);
					
					bitmap = BitmapFactory.decodeByteArray(data,0,data.length);
				}
			}catch(Exception e){
					e.printStackTrace();
				}
			return bitmap;
		}
		//主要是更新IO操作
		@Override
		protected void onPostExecute(Bitmap result) {
			// TODO Auto-generated method stub
			super.onPostExecute(result);
			imageView1.setImageBitmap(bitmap);
			dialog.dismiss();
		}
		
  }
}


使用异步任务类完成了下载任务 

你可能感兴趣的:(android,异常处理,exception,网络)