AsyncTask的初步了解

下面以下载图片并显示为例:

首先我们需要知道的是AsyncTask是对线程池+Handler的进一步封装。

下面看一个简单的代码:

 1 public class MainActivity extends Activity {
 2     private ImageView ivIcon;
 3     private static String myUrl = "http://192.168.1.2:8080/tomcat.gif";//图片的ip地址
 4     @Override
 5     protected void onCreate(Bundle savedInstanceState) {
 6         super.onCreate(savedInstanceState);
 7         setContentView(R.layout.activity_main);
 8         ivIcon = (ImageView)findViewById(R.id.iv_icon);
 9
10         new MyTask().execute(myUrl);// 启动AsyncTask
11     }
12
13     // AsyncTask 异步封装的工具, 可以实现异步请求及主界面更新(对线程池+handler的封装)
14     class MyTask extends AsyncTask<String,Integer,Bitmap>{
15
16         // 1.预加载, 运行在主线程
17         @Override
18         protected void onPreExecute() {
19             super.onPreExecute();
20         }
21
22         // 2.正在加载, 运行在子线程(核心方法), 可以直接异步请求
23         @Override
24         protected Bitmap doInBackground(String... params) {
25             return  downLoad(params[0]);
26         }
27
28         // 3.更新进度的方法, 运行在主线程
29         @Override
30         protected void onProgressUpdate(Integer... values) {
31             super.onProgressUpdate(values);
32         }
33
34         // 4.加载结束, 运行在主线程(核心方法), 可以直接更新UI
35         @Override
36         protected void onPostExecute(Bitmap bitmap) {
37             ivIcon.setImageBitmap(bitmap);
38         }
39     }
40
41     /**
42      * 从服务器下载图片
43      * @param url  服务器的IP
44      * @return 请求成功返回Bitmap对象,不成功返回null
45      */
46     private Bitmap downLoad(String url){
47         try {
48             HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
49             conn.setRequestMethod("GET");
50             conn.setConnectTimeout(5000);
51             conn.setReadTimeout(5000);
52             conn.connect();
53
54             int code = conn.getResponseCode();
55
56
57             if (code==200){
58                 InputStream inputStream = conn.getInputStream();
59                 Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
60                 return bitmap;
61             }
62         } catch (IOException e) {
63             e.printStackTrace();
64         }
65
66         return null;
67     }
68 }

需要注意的是AsyncTask里面的doInBackground()方法是运行在子线程的,剩下的三个方法是运行在主线程的。所以我们在doInBackground()方法中做耗时操作。

时间: 2024-10-18 22:31:43

AsyncTask的初步了解的相关文章

Android AsyncTask 封装初步一

AsyncTask基本使用 先从最熟悉的Task使用开始说起,给出LastDaysTask作为实例如下 @SuppressLint("NewApi") private class LastDaysTask extends AsyncTask<Void, Integer, Boolean>{ @Override protected void onPreExecute() { //TODO UI线程或者主线程 } @Override protected Boolean doIn

AsyncTask中各个函数详细的调用过程,初步实现异步任务

异步任务是我们经常要使用的东西,android中提供了一套解决方案,从异步任务的开始到结束,相当完善.本实例没有任何应用价值,只是说明了AsyncTask中各个函数的调用顺序. 具体的结果看下面的Log输出即可: 异步任务类: AsyncTaskTest.java package com.kale.asynctask; import java.net.URL; import android.R.integer; import android.os.AsyncTask; /** * @author

Dagger2 使用初步

Dagger2 是一个Android依赖注入框架,由谷歌开发,最早的版本Dagger1 由Square公司开发.依赖注入框架主要用于模块间解耦,提高代码的健壮性和可维护性.Dagger 这个库的取名不仅仅来自它的本意“匕首”,同时也暗示了它的原理.Jake Wharton 在对 Dagger 的介绍中指出,Dagger 即 DAG-er,这里的 DAG 即数据结构中的 DAG——有向无环图(Directed Acyclic Graph).也就是说,Dagger 是一个基于有向无环图结构的依赖注入

如何在退出一个activity后,很好的取消AsyncTask继续运行?

问题 当进入一个详细页面,这时程序会弹出一个对话框加载网络数据,可是发现用户经常因为数据加载慢,就快速的退出这个页面,这样反复来回几次后,发现AsyncTask不再继续加载,而是慢慢的等待,查了下个数,是前几个没有及时的关闭,导致当前的异步任务一直在等待. 所以想请教如何在退出一个页面后,也同时关闭对应的异步任务? 初步解决代码方案: public class Task extends AsyncTask<Void, Void, Void>{@Overrideprotected Void do

Handler, AsyncTask用法简单示例

package com.jim.testapp; import android.app.Activity; import android.os.AsyncTask; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import androi

初步了解CPU

了解CPU By JackKing_defier 首先说明一下,本文内容主要是简单说明CPU的大致原理,所需要的前提知识我会提出,但是由于篇幅我不会再详细讲解需要的其他基础知识.默认学过工科基础课. 一.总述 先从计算机的结构说起,在现代计算机中,CPU是核心,常常被比喻为人的大脑.现在的计算机都为“冯·诺依曼机”,“冯诺依曼机”的一个显著的特点就是由运算器.存储器.控制器.输入设备和输出设备组成.CPU是运算器和控制器合起来的统称,因为运算器和控制器在逻辑关系和电路结构上联系十分紧密,尤其在大

zerglurker的C语言教程004——指针初步讲解

在上次的教程里面,我提到了指针. 针对指针,这次我将简单的讲讲,后面我还会讲到--那个时候你应该有了相当的基础. 首先,先讲讲指针类型. 任何类型关键字后面加一个*符号,就会变成指针类型. 比如: char → char* 字符指针 int → int* 整数指针 double→double* 双精度指针 甚至还可以这样: char*→char** 字符指针的指针类型 →char*** 字符指针的指针的指针类型- 指针本质上是一个内存地址值,该内存地址上存放的是相关类型的数值.但是void*指针

Android异步加载全解析之使用AsyncTask

Android异步加载全解析之使用AsyncTask 概述 既然前面提到了多线程,就不得不提到线程池,通过线程池,不仅可以对并发线程进行管理,更可以提高他们执行的效率,优化整个App.当然我们可以自己创建一个线程池,不过这样是很烦的,要创建一个高效的线程池还是挺费事的,不过,Android系统给我吗提供了AsyncTask这样一个类,来帮助我们快速实现多线程开发,它的底层实现,其实就是一个线程池. AsyncTask初探 AsyncTask,顾名思义就是用来做异步处理的.通过AsyncTask,

nodejs,webpack安装以及初步运用

nodejs安装: 1.下载:https://nodejs.org/en/download/ 2.安装node-v6.11.3-x64.msi文件,直接默认安装(next--): 3.验证是否完成安装:cmd 进入后输入命令 node -v  回车能得到nodejs版本号: 输入node 回车再输入console.log('aaaaa') 回车能正常显示输出. 这表示nodejs安装成功. webpack安装: 1.npm安装:在f盘新建文件夹webpack,在webpack文件夹建文件夹dem