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

简介: MainActivity如下: package cn.cc;import java.io.InputStream;import java.net.

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>



相关文章
|
弹性计算 缓存 监控
云原生体系下 Serverless 弹性探索与实践
SAE 通过对弹性组件和应用全生命周期的不断优化以达到秒级弹性,并在弹性能力,场景丰富度,稳定性上具备核心竞争力,是传统应用 0 改造上 Serverless 的最佳选择。
|
网络协议 前端开发
「从URL到网页🌏」构建计算机网络知识体系-03
「从URL到网页🌏」构建计算机网络知识体系-03
198 0
「从URL到网页🌏」构建计算机网络知识体系-03
|
8天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
7天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
348 130
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
19天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1332 8
|
7天前
|
人工智能 Java API
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
本文介绍AI大模型的核心概念、分类及开发者学习路径,重点讲解如何选择与接入大模型。项目基于Spring Boot,使用阿里云灵积模型(Qwen-Plus),对比SDK、HTTP、Spring AI和LangChain4j四种接入方式,助力开发者高效构建AI应用。
335 122
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
|
6天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。
|
18天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1422 87