AsyncTask的使用

package com.example.asynctask;

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

public class MainActivity extends Activity {
	private AsyncImageLoader loader;
	
	private ImageView iv;
	
	private ProgressBar bar;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initView();
		
		loader = new AsyncImageLoader();
		//传入的参数类型由定义类时的第一个type类型确定
		loader.execute(R.drawable.a);
	}
	
	private void initView() {
		iv = (ImageView) findViewById(R.id.image_view);
		bar = (ProgressBar) findViewById(R.id.progress_bar);
		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	
	/**
	 * @author Administrator
	 * AsyncTask可以直接修改UI,内置handler
	 * 三种类型的含义:
	 * Params, the type of the parameters sent to the task upon execution. 
     * Progress, the type of the progress units published during the background computation. 
     * Result, the type of the result of the background computation. 
	 */
	private class AsyncImageLoader extends AsyncTask<Integer, Integer, Bitmap> {
		
		@Override
		protected void onPreExecute() {
			bar.setMax(20);
			bar.setVisibility(View.VISIBLE);
		}

		@Override
		protected Bitmap doInBackground(Integer... params) {
			for(int i=1; i<=20; i++) {
				publishProgress(i);//会调用onProgressUpdate方法
				try {
					new Thread().sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				if(i == 16)
					//用于取消加载
					cancel(true);
			}
			if(isCancelled()) 
				return null;
			return BitmapFactory.decodeResource(getResources(), params[0]);
		}
		
		@Override
		protected void onProgressUpdate(Integer... values) {
			bar.setProgress(values[0]);
		}
		
		@Override
		protected void onPostExecute(Bitmap result) {
			//result即为doInBackground的返回值
			bar.setVisibility(View.GONE);
			iv.setImageBitmap(result);
		}
	}
 
}

用AsyncTask获取网络数据,源码:

package com.example.asynctask;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.io.Reader;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends Activity {
	//自定义异步加载类
	private AsyncImageLoader loader;
	
	private ImageView iv;
	private ProgressBar bar;
	private TextView tv;
	//网络连接的manager
	private ConnectivityManager manager;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initView();
		netCheck();
		networkChange();
		
		String url = "http://www.dm123.cn/ecms/d/file/2013-09-16/6615d9c9513c89d2e156908fb0b3193b.jpg";
		loader = new AsyncImageLoader();
			//传入的参数类型由定义类时的第一个type类型确定
		loader.execute(url);
	}
	//初始化view
	private void initView() {
		iv = (ImageView) findViewById(R.id.image_view);
		bar = (ProgressBar) findViewById(R.id.progress_bar);
		tv = (TextView) findViewById(R.id.text_view);
	}
	//检查网络状态
	private void netCheck() {
		manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo[] networkInfos = manager.getAllNetworkInfo();
		for(NetworkInfo network : networkInfos) {
			System.out.println("the name of the network type: " + network.getTypeName());
			//在每次用网络传输东西时都应该先检查网络是否连接
			System.out.println("whether network connectivity exists: " + network.isConnected());
			System.out.println("whether network connectivity is possible: " + network.isAvailable());
		}
	}
	//当网络状态发生改变时,用receiver接收
	private void networkChange() {
		BroadcastReceiver receiver = new BroadcastReceiver() {
			
			@Override
			public void onReceive(Context context, Intent intent) {
				NetworkInfo mobile = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
				NetworkInfo wifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
				if(mobile.isAvailable() && mobile.isConnected()) {
					System.out.println("Mobile可用且已连接");
				} else if(wifi.isAvailable() && wifi.isConnected()) {
					System.out.println("WiFi可用且已连接");
				} else {
					System.out.println("网络不可用");
				}
			}
		};
		IntentFilter filter = new IntentFilter();
		filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
		//注册receiver,当网络状态发生改变时,系统会发出广播
		registerReceiver(receiver, filter);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	
	/**
	 * @author Administrator
	 * AsyncTask可以直接修改UI,内置handler
	 * 三种类型的含义:
	 * Params, the type of the parameters sent to the task upon execution. 
     * Progress, the type of the progress units published during the background computation. 
     * Result, the type of the result of the background computation. 
	 */
	private class AsyncImageLoader extends AsyncTask<String, Integer, Bitmap> {
		
		@Override
		protected void onPreExecute() {
			bar.setVisibility(View.VISIBLE);
		}

		@Override
		protected Bitmap doInBackground(String... params) {
			URL url = null;
			try {
				url = new URL(params[0]);
			} catch (MalformedURLException e) {
				e.printStackTrace();
			}
			return readBitmap(url);
		}
		
		@Override
		protected void onProgressUpdate(Integer... values) {
			bar.setProgress(values[0]);
		}
		
		@Override
		protected void onPostExecute(Bitmap result) {
			bar.setVisibility(View.GONE);
			iv.setImageBitmap(result);
		}
		//读取图片
		private Bitmap readBitmap(URL url) {
			Bitmap bitmap = null;
			int fileLength = 0, doneLength = 0;
			try {
				HttpURLConnection conn = (HttpURLConnection) url.openConnection();
				//设置连接超时
				conn.setConnectTimeout(10000);
				//设置读取超时
				conn.setReadTimeout(150000);
				//设置连接方式
				conn.setRequestMethod("GET");
				System.out.println("请求码: " + conn.getResponseCode());
				//根据请求码判断是否连接成功
				if(!(conn.getResponseCode() == HttpURLConnection.HTTP_OK)) {
					//如果不成功则加载一个本地图片
					bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
					return bitmap;
				}
				//把网页文件内容的字节流转换成字符流
				InputStream is = conn.getInputStream();
				//ByteArrayOutputStream是把内容读到一个byte数组里(即存储到内存中)
				//而ByteArrayInputStream是从一个数组里读取内容,返回所读取的值或者读取到一个数组里,
				//返回读取的长度
				ByteArrayOutputStream bos = new ByteArrayOutputStream();
				//得到文件长度
				fileLength = conn.getContentLength();
				bar.setMax(fileLength);
				byte[] buf = new byte[1024 * 1024];
				int len = 0;
				//记录读取的次数
				int num = 0;
				while((len = is.read(buf)) != -1) {
					bos.write(buf, 0, len);
					doneLength +=len;
					publishProgress(doneLength);
					num ++;
				}
				System.out.println("读取的次数" + num);
				ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
//				byte[] data = bos.toByteArray();
//				System.out.println(data.length);
//				bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
				bitmap = BitmapFactory.decodeStream(bis);
				is.close();
			} catch (IOException e) {
				System.out.println("网络连接失败!");
				e.printStackTrace();
			}
			return bitmap;
		}
		//读取html文件
		private String readHtml(URL url) {
			File file = new File(Environment.getExternalStorageDirectory(), "net.html");
			if(!file.exists()) {
				try {
					file.createNewFile();
				} catch (IOException e) {
					System.out.println("文件创建失败");
					e.printStackTrace();
				}
			}
			StringBuilder builder = new StringBuilder();
			int fileLength = 0, doneLength = 0;
			try {
//				Writer writer = new PrintWriter(new FileOutputStream(file));
				HttpURLConnection conn = (HttpURLConnection) url.openConnection();
				//设置连接超时
				conn.setConnectTimeout(10000);
				//设置读取超时
				conn.setReadTimeout(150000);
				//设置连接方式
				conn.setRequestMethod("GET");
				System.out.println("请求码: " + conn.getResponseCode());
				//把网页文件内容的字节流转换成字符流
				Reader reader = new InputStreamReader(conn.getInputStream());
				fileLength = conn.getContentLength();
				bar.setMax(fileLength);
				char[] buf = new char[1024 * 1024];
				int len = 0;
				while((len = reader.read(buf)) != -1) {
//					writer.write(buf, 0, len);
					builder.append(buf);
					doneLength +=len;
					publishProgress(doneLength);
				}
				reader.close();
//				writer.close();
			} catch (IOException e) {
				System.out.println("网络连接失败!");
				e.printStackTrace();
			}
			return builder.toString();
		}
	}
 
}



网络连接首先要判断有哪些网络可用,然后监听网络状态

网络数据传输用HttpURLConnection,设置各种参数,之后接可以读取网页内容并存储或者展现在UI上

读取的时候,如果是网页则直接用字符流,不用自己再转换流了,如果是图片等用字节流,读取完后转化成相应的类型,(Bitmap可直接接受io流)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值