AsyncTask异步任务使用详细实例(二)

MainActivity如下:

package cn.cc;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import cn.cc.AsyncTaskSubClass.AsyncTaskCallbackInterface;
import cn.cc.AsyncTaskSubClass.AsyncTaskPerformInterface;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;
/**
 * Demo描述:
 * 平常我们写一个AsyncTask的时候把异步操作已经异步完成后的操作
 * 是放在doInBackground()和onPostExecute()方法中的.
 * 这样显得代码比较臃肿,而且不方便复用.
 * 所以在此采用AsyncTask与回调结合的方式:抽象AsyncTask的代码从而
 * 简化代码,并且利于重用.
 */
public class MainActivity extends Activity {
	private Context mContext;
	private ImageView mImageView;
	private AsyncTaskSubClass mAsyncTaskSubClass;
	private String mFavIconPathString =null;
	private final String FAVICON_SERVICE="http://www.google.com/s2/favicons?domain=";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        init();
    }

    private void init(){
    	mContext=this;
    	mImageView=(ImageView) findViewById(R.id.imageView);
    	mFavIconPathString = FAVICON_SERVICE+"http://www.ifeng.com/";
        startAsyncTask();
    }

	private void startAsyncTask() {
		mAsyncTaskSubClass = new AsyncTaskSubClass(mContext,
				new AsyncTaskPerformInterface() {
					@Override
					public Bitmap performAsyncTask(String string) {
						try {
							Bitmap bitmap=null;
							InputStream inputStream = null;
							URL imageUrl = new URL(string);
							HttpURLConnection httpURLConnection = (HttpURLConnection) imageUrl.openConnection();
							httpURLConnection.setConnectTimeout(5000);
							httpURLConnection.setRequestMethod("GET");
							if (httpURLConnection.getResponseCode() == 200) {
								inputStream = httpURLConnection.getInputStream();
								bitmap = BitmapFactory.decodeStream(inputStream);
								return bitmap;
							}

						} catch (Exception e) {

						}
						return null;
					}
				},
				new AsyncTaskCallbackInterface() {
					@Override
					public void asyncTaskFinishCallback(Bitmap bitmap) {
						mImageView.setImageBitmap(bitmap);
					}
				});
		//开始执行一个异步任务
		mAsyncTaskSubClass.execute(mFavIconPathString);
	}
}

AsyncTaskSubClass如下:

package cn.cc;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.AsyncTask;
//构造函数AsyncTask<Params, Progress, Result>参数说明:
//Params   启动任务执行的输入参数
//Progress 后台任务执行的进度
//Result   后台计算结果的类型
public class AsyncTaskSubClass extends AsyncTask<String, Integer, Bitmap> {
	private Context mContext;
	private AsyncTaskPerformInterface mAsyncTaskPerformInterface;
	private AsyncTaskCallbackInterface mAsyncTaskCallbackInterface;

	public AsyncTaskSubClass(
			     Context context,
			     AsyncTaskPerformInterface asyncTaskPerformInterface,
			     AsyncTaskCallbackInterface asyncTaskCallbackInterface) {
		super();
		this.mContext = context;
		this.mAsyncTaskPerformInterface = asyncTaskPerformInterface;
		this.mAsyncTaskCallbackInterface = asyncTaskCallbackInterface;
	}

	//执行异步操作的回调接口
	public interface AsyncTaskPerformInterface {
		public Bitmap performAsyncTask(String string);
	}

	//异步操作完成的回调接口
	public interface AsyncTaskCallbackInterface {
		public void asyncTaskFinishCallback(Bitmap bitmap);
	}

	@Override
	protected void onPreExecute() {
		super.onPreExecute();
		System.out.println("调用onPreExecute()方法--->准备开始执行异步任务");
	}

	//此处strings[0]对应于AsyncTask<String, Integer, Bitmap>
	//中的第一个参数,即异步任务的输入参数.
	//此处Bitmap对应于AsyncTask<String, Integer, Bitmap>
	//中的第三个参数,即异步任务的输出结果.
	@Override
	protected Bitmap doInBackground(String... strings) {
		System.out.println("调用doInBackground()方法--->开始执行异步任务");
		Bitmap bitmap=null;
		if(mAsyncTaskPerformInterface!=null){
			bitmap=mAsyncTaskPerformInterface.performAsyncTask(strings[0]);
		}
		return bitmap;
	}

	//此处Bitmap对应于AsyncTask<String, Integer, Bitmap>
	//中的第三个参数,即异步任务的输出结果.
	@Override
	protected void onPostExecute(Bitmap bitmap) {
		System.out.println("调用onPostExecute()方法--->异步任务执行完毕");
		if(mAsyncTaskCallbackInterface!=null){
			mAsyncTaskCallbackInterface.asyncTaskFinishCallback(bitmap);
		}
	}

	//异步执行时在主线程中更新异步任务的执行信息
	//此处values[0]对应于AsyncTask<String, Integer, Bitmap>
	//中的第二个参数,即异步任务的执行进度.
	@Override
	protected void onProgressUpdate(Integer... values) {
		return;
	}

	//异步任务被取消时,在主线程中执行相关的操作
	@Override
	protected void onCancelled() {
		super.onCancelled();
		System.out.println("调用onCancelled()方法--->异步任务被取消");
	}

}

main.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />

</RelativeLayout>



时间: 2024-08-16 13:46:05

AsyncTask异步任务使用详细实例(二)的相关文章

Android中AsyncTask异步任务使用详细实例(一)_Android

AsyncTask是Android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 使用AsyncTask最少要重写以下两个方法: 1.doInBackground(Params-) 后台执行,比较耗时的操作都可以放在这里.注意这里不能直接操作UI.此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间.在执行过程中可以调用publicProgress(Progres

Android中AsyncTask异步任务使用详细实例(一)

AsyncTask是Android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 使用AsyncTask最少要重写以下两个方法: 1.doInBackground(Params-) 后台执行,比较耗时的操作都可以放在这里.注意这里不能直接操作UI.此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间.在执行过程中可以调用publicProgress(Progres

AsyncTask异步任务使用详细实例(一)

 MainActivity如下: package com.example.asynctasktest; import java.io.ByteArrayOutputStream; import java.io.InputStream; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.

Android利用AsyncTask异步类实现网页内容放大缩小_Android

本文实例为大家分享了AsyncTask异步类实现网页内容放大缩小的详细代码,供大家参考,具体内容如下 WebActivity.java: package com.supermario.filemanager; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import org.apache.http.pro

Android Loader 异步加载详解二:探寻Loader内部机制

Android Loader 异步加载详解二:探寻Loader内部机制 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70259914 本文出自[赵彦军的博客] Android Loader 异步加载详解一:基础概念 Android Loader 异步加载详解二:探寻Loader内部机制 在上一篇文章中,讲解了 Loader 的基本概念.这一篇将会用实战的方式来探寻 Android Loader的内部机制.我们准备做一个 读取手

Android利用AsyncTask异步类实现网页内容放大缩小

本文实例为大家分享了AsyncTask异步类实现网页内容放大缩小的详细代码,供大家参考,具体内容如下 WebActivity.java: package com.supermario.filemanager; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import org.apache.http.pro

详解Android App中的AsyncTask异步任务执行方式_Android

基本概念 AsyncTask:异步任务,从字面上来说,就是在我们的UI主线程运行的时候,异步的完成一些操作.AsyncTask允许我们的执行一个异步的任务在后台.我们可以将耗时的操作放在异步任务当中来执行,并随时将任务执行的结果返回给我们的UI线程来更新我们的UI控件.通过AsyncTask我们可以轻松的解决多线程之间的通信问题. 怎么来理解AsyncTask呢?通俗一点来说,AsyncTask就相当于Android给我们提供了一个多线程编程的一个框架,其介于Thread和Handler之间,我

JQuery插件ajaxfileupload.js异步上传文件实例

这篇文章主要介绍了JQuery插件ajaxfileupload.js异步上传文件实例,本文直接给出了HTML代码和JS代码以及后台处理代码,需要的朋友可以参考下     在服务器端做文件上传的过程中,如果使用web服务器短端的上传控件去上传文件的话,会导致页面刷新一次,这样对用户的体验就不是很友好了.ajaxfileupload.js是一款jQuery的异步上传文件插件,使用简单且容易上手. 前置条件:ajaxfileupload.js文件,百度下载一个就行. JS引用:  代码如下: <scr

Photoshop详细实例解析计算命令的原理

  本教程主要使用Photoshop详细实例解析计算命令的原理,通过通道利用计算命令计算出精确选区,应用图像命令调整色彩.不同于色相/饱和度.色彩平衡的色彩调整方式. 混合模式是计算命令的灵魂,使用计算命令为选择 不少人常常会问:计算命令的实质究竟是什么? Photoshop帮助文件这样描述计算命令,计算命令使您可以混合两个来自一个或多个源图像的单个通道.然后可以将结果应用到新图像或新通道,或现用图像的选区.不能对复合通道应用计算命令. 它是一个计算过程的描述,这个描述对于能够熟练使用计算命令的