AsyncTask异步交互的用法简介

原创 2016年05月31日 09:35:51

首先定义一个类,继承AsyncTask类,并实现相关方法:

<span style="font-size:18px;">/**
 * @author WJL <span style="color:#ff0000;">第一个泛型:规定doInBackground方法的参数类型,规定AsyncTask.execute方法传递的参数类型
 *         第二个泛型:规定onProgressUpdate方法参数的类型,publishProgress参数类型
 *         第三个泛型:规定doInBackground方法的返回值类型</span>
 */
public class MyAsyncTask extends AsyncTask<String, Double, String> {
	TextView textView;
	 ProgressBar bar;
	/**
	 * @param textView
	 * @param bar 
	 */
	public MyAsyncTask(TextView textView, ProgressBar bar) {
		this.textView=textView;
		this.bar=bar;
	}

	// Runs on the UI thread before doInBackground.
	@Override
	// 运行在主线程,在doInBackground方法之前执行
	protected void onPreExecute() {
		System.out.println("准备联网");
	}

	@Override
	// 运行在子线程,做耗时操作
	// 返回值被onPostExecute接收
	<span style="color:#ff0000;">protected String doInBackground(String... params)</span> {

		String string = "100";

		HttpClient httpClient = new DefaultHttpClient();

		// 做联网请求,得到传递的参数,因为是可变长度的数组,想取第一个参数,所以去角标为0的元素
		HttpGet httpGet = new HttpGet(params[0]);

		try {

			HttpResponse httpResponse = httpClient.execute(httpGet);

			if (httpResponse.getStatusLine().getStatusCode() == 200) {

				HttpEntity httpEntity = httpResponse.getEntity();
				//得到实体里的json
				 string = EntityUtils.toString(httpEntity);
				
			}

		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} 

		return string;

	}

	// Runs on the UI thread after doInBackground.
	// 运行在主线程,在doInBackground方法之后执行,接收doInBackground方法的返回值</span>
<span style="font-size:18px;">在此方法内更新UI线程中的控件
	<span style="color:#ff0000;">protected void onPostExecute(String result)</span> {

		 System.out.println(result);
		 //更新进度
//		 publishProgress(100d);
	};
	
	

	// 更新进度,运行在主线程上,在publishProgress运行之后
	protected void onProgressUpdate(Double[] values) {
//		System.out.println("执行进度:" + values[0]);
		double r = values[0];
		//向上取整
		double floor = Math.ceil(r );
		
		textView.setText(floor+"");
//		bar.setProgress(double.);
	};

	
	//获取进度
	public void progress(){
		
		/*	// 获取数据总长度
		long contentLength = httpEntity.getContentLength();
		System.out.println(contentLength);
		// 获取网络数据
		InputStream inputStream = httpEntity.getContent();

		BufferedReader bufferedReader = new BufferedReader(
				new InputStreamReader(inputStream, "utf-8"));

		char[] buf = new char[1];
        //总读取进度
		int sun = 0;
		//本次读取的进度
        int i;
        StringBuilder buffer=new StringBuilder();
		while ((i = bufferedReader.read(buf)) != -1) {
			
			sun=sun+i;
			double count = (((double)sun / (double)contentLength))*100;
			
             //实时更新进度
			publishProgress(count); 
			buffer.append(new String(buf));
		}

		bufferedReader.close();
		inputStream.close();
       string = buffer.toString();*/
		
		
		////////////////////////////////////////////////
		
	}
	
}</span>

在UI主线程调用(注:创建一个MyAsyncTask对象,只能调用一次excute方法)

<span style="font-size:18px;">public class MainActivity extends Activity {
//	String path="http://169.254.214.171:8080/bwie/city.json";
	String key = "3ac9f31ff66b9746539472887b3799c3";
	// 通过get请求时的接口地址
	String get_path = "http://web.juhe.cn:8080/constellation/getAll?consName=狮子座&type=today&key="
			+ key;
	private TextView textView;
	private ProgressBar bar;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		textView = (TextView) findViewById(R.id.textView);
		ProgressBar	bar = (ProgressBar) findViewById(R.id.pro);
		MyAsyncTask myAsyncTask=new MyAsyncTask(textView,bar);
		try {
			
			String string = myAsyncTask.execute(get_path).get();
			textView.setText(string);
			System.out.println(string);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	
}</span>


关于AsyncTask异步下载图片带有进度条更新

首先定义一个ImageView 和一个Button:
  • xiaorenwu1206
  • xiaorenwu1206
  • 2014年10月11日 10:02
  • 4627

AsyncTask异步实现文件下载

做android开发的都知道,我们在主线程中不能进行耗时太久的操作,否则就可能报ANR,所有耗时的操作都要异步进行。android中的异步方法也很多,可以用Handler,可以用Thread及Runn...
  • true100
  • true100
  • 2015年03月06日 16:56
  • 1128

AsyncTask异步任务类

AsyncTask异步任务类,比Handle更轻量级,更适合简单的异步操作。内部封装了Handle,在使用AsyncTask类进行刷新控件的刷新操作时,不用再额外创建声明Handle,可以直接使Asy...
  • littlewhitetree
  • littlewhitetree
  • 2016年07月18日 20:49
  • 1076

AsyncTask异步方式详解及其使用

在实际应用中经常会遇到比较耗时任务的处理,比如网络连接,数据库操作等情况时,如果这些操作都是放在主线程(UI线程)中,则会造成UI的假死现象,Android中可以使用AsyncTask和Handler...
  • zuolongsnail
  • zuolongsnail
  • 2011年05月04日 15:06
  • 7630

网络连接之Http及异步操作AsyncTask

Http个人理解为是基于请求、响应,无状态,应用层的超文本传输协议。其特点有:支持客户端与服务器之间交互模式;简单快捷;灵活;无连接;无状态。       引用具体介绍:(想要更深入的了解可以参考下...
  • q394895302
  • q394895302
  • 2015年08月13日 09:52
  • 1445

android异步操作类AsyncTask的使用详解

android提供了一套专门用于异步处理的类。即:AynsTask类。使用这个类可以为耗时程序开辟一个新线程进行处理,处理完时返回。 AsyncTask的回调逻辑关系  1.主线程调用AsynTa...
  • liuyiming_
  • liuyiming_
  • 2012年04月15日 09:04
  • 5164

异步交互——AsyncTask

AsyncTask
  • I_love_crazy
  • I_love_crazy
  • 2016年05月04日 12:06
  • 127

AsyncTask异步交互

package com.example.picdemo; import java.io.InputStream; import java.net.URL; import org.apac...
  • fanqin1125
  • fanqin1125
  • 2016年05月13日 19:58
  • 91

异步交互AsyncTask

//异步请求 class MyAsyncTask extends AsyncTask{ private String string; @Override protected S...
  • llcc_1314
  • llcc_1314
  • 2016年05月31日 15:09
  • 102

异步任务加载网络数据——AsyncTask使用

AsyncTask类简单介绍 Android从1.5开始引入了AsyncTask这个类,AsyncTask内部使用Java 1.5的并发库比普通初级Android开发者编写的Thread+Handle...
  • qq_34258009
  • qq_34258009
  • 2016年04月09日 23:53
  • 2129
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AsyncTask异步交互的用法简介
举报原因:
原因补充:

(最多只允许输入30个字)