Android中基于HTTP的通信技术(0)AsyncTask的使用

最近补充了点的android网络知识,来自于极客学院,自己怕忘便整理了下当作自己的笔记用。

我们知道如果线程执行时很容易出现假死状况(加载时间过长),android使用了AsyncTask这个类来解决这个问题

下面是实例:

package com.example.usingasynctask;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {
	private TextView textView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		textView = (TextView) findViewById(R.id.textView);
		findViewById(R.id.btn_asyncTask).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				readURL("http://www.csdn.net/");
				
			}
		});
	}

public void readURL(String url){
	//创建一个匿名的AsyncTask实例
	new AsyncTask<String, Float, String>() {   //<Params, Progress, Result> 三个参数分别是输入的类型,处理过程中返回值的类型,和返回结果的数据类型

		@Override
		//类似于线程中的run方法,也就是执行后台的操作
		protected String doInBackground(String... params) { //这里的参数就是传入的初始值
			try {
				
				URL url = new URL(params[0]);
				URLConnection urlConnection = url.openConnection();//创建连接 并捕获try-catch
				long total = urlConnection.getContentLength();//获取长度
				
				InputStream is =  urlConnection.getInputStream();
				InputStreamReader isr = new InputStreamReader(is);
				BufferedReader br  = new BufferedReader(isr);
				//完成上面包装后来读取和存放数据
				String line;  
				StringBuilder stringBuilder =  new StringBuilder();
				while((line = br.readLine()) != null){ //如果有数据,调用append方法传入line字符串
					stringBuilder.append(line);
					publishProgress((float)br.toString().length()/total);//获取执行进度的百分比
				}
				br.close();
				isr.close();
				return stringBuilder.toString();
				
 			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			
			
			
			return null;
		}
		//添加回调方法
		@Override
		protected void onPreExecute() { 
			Toast.makeText(MainActivity.this, "开始读取", Toast.LENGTH_SHORT).show();
			super.onPreExecute();
		}

		@Override
		protected void onPostExecute(String result) {//此处的result是doInBackground的返回值stringBuilder.toString();
			textView.setText(result);
			super.onPostExecute(result);
		}

		@Override
		protected void onProgressUpdate(Float... values) { //执行过程中对外发布执行的进度 ,void是上方自己指定的数据类型
			System.err.println(values[0]);
			super.onProgressUpdate(values);
		}
		/*
		 * UI互动操作这执行
		 */
		@Override
		protected void onCancelled(String result) {
			// TODO Auto-generated method stub
			super.onCancelled(result);
		}

		@Override
		protected void onCancelled() {
			// TODO Auto-generated method stub
			super.onCancelled();
		} 
	}.execute(url); //url是上面传入的参数
}

}
下面是效果图,很直观的体现了异步加载,而且点击按钮是没有假死现象,实现了整个过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值