1、当程序启动的时候,Android同时会启动一个对应的线程,【主线程、UI线程】主要负责处理与UI相关的线程
2、UI线程不允许访问网络进行耗时操作
3、子线程不允许更新UI。
由于Android中主线程不能访问网络、子线程不能更新UI,需要线程间通讯 完成数据对象传递。Android在1.5版本引入了AsyncTask. AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦。阅读AsyncTask的源码可知,AsyncTask是使用java.util.concurrent 框架来管理线程以及任务的执行的,concurrent框架是一个非常成熟,高效的框架,经过了严格的测试。这说明AsyncTask的设计很好的解决了匿名线程存在的问题。
AsyncTask定义了三种泛型类型 Params,Progress和Result.
子类必须实现抽象方法doInBackground(Params… p) ,在此方法中实现任务的执行工作,比如连接网络获取数据等。通常还应该实现onPostExecute(Result r)方法,因为应用程序关心的结果在此方法中返回。需要注意的是AsyncTask一定要在主线程中创建实例。
onPreExecute()当任务执行之前开始调用此方法,可以在这里显示进度对话框。
doInBackground(Params…)此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
onProgressUpdate(Progress…)此方法在主线程执行,用于显示任务执行的进度。
onPostExecute(Result)此方法在主线程执行,任务执行的结果作为此方法的参数返回。

实例::
xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.zjs.imageview.IntentActivity"><Buttonandroid:id="@+id/down_load"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="下载图片"/><ImageViewandroid:id="@+id/downloadimage"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:background="@android:color/holo_red_light"/>
</LinearLayout>

Activity::

package com.zjs.imageview;import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;public class IntentActivity extends AppCompatActivity implements View.OnClickListener {private ProgressDialog dialog;private ImageView mImage;private Button mDown_load;private String path = "http://cdnq.duitang.com/uploads/item/201505/20/20150520102944_CiL3M.jpeg";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_intent);init();mImage = (ImageView) findViewById(R.id.downloadimage);mDown_load = (Button) findViewById(R.id.down_load);mDown_load.setOnClickListener(this);}private void init() {mImage = (ImageView) findViewById(R.id.downloadimage);mDown_load = (Button) findViewById(R.id.down_load);mDown_load.setOnClickListener(this);dialog = new ProgressDialog(this);dialog.setCancelable(true);dialog.setTitle("提醒");dialog.setMessage("正在下载中...");dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);}@Overridepublic void onClick(View view) {new DownLoadImageTask().execute(path);}private class DownLoadImageTask extends AsyncTask<String, Integer, Bitmap> {@Overrideprotected void onPreExecute() {dialog.show();super.onPreExecute();}@Overrideprotected Bitmap doInBackground(String... params) {URL myFileUrl = null;Bitmap bitmap = null;InputStream is = null;HttpURLConnection conn = null;try {myFileUrl = new URL(params[0]);} catch (MalformedURLException e) {e.printStackTrace();}try {conn = (HttpURLConnection) myFileUrl.openConnection();conn.setDoInput(true);conn.connect();is = conn.getInputStream();bitmap = BitmapFactory.decodeStream(is);is.close();} catch (IOException e) {e.printStackTrace();} finally {try {if (is != null) {is.close();}if (conn != null) {conn.disconnect();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return bitmap;}@Overrideprotected void onProgressUpdate(Integer... values) {dialog.setProgress(values[0]);super.onProgressUpdate(values);}@Overrideprotected void onPostExecute(Bitmap result) {if (result != null) {mImage.setImageBitmap(result);Toast.makeText(getApplication(), "下载成功", Toast.LENGTH_LONG).show();} else {Toast.makeText(getApplication(), "下载失败", Toast.LENGTH_LONG).show();}dialog.dismiss();super.onPostExecute(result);}}public Bitmap getBitmapFromNet(String Imagepath) {HttpURLConnection conn;try {URL url = new URL(Imagepath);conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("get");conn.setDoInput(true); //允许输入流,即允许下载conn.setDoOutput(true); //允许输出流,即允许上传conn.setUseCaches(false); //不使用缓冲conn.setRequestMethod("GET"); //使用get请求conn.connect();if (conn.getResponseCode() == 200) {Bitmap bitmap = BitmapFactory.decodeStream(conn.getInputStream());if (bitmap != null) {return bitmap;}} else {Toast.makeText(this, "网络连接失败", Toast.LENGTH_SHORT).show();}} catch (Exception e) {e.printStackTrace();}return null;}
}

经过测试,可以实现图片下载。

Android中异步任务AsyncTask的使用相关推荐

  1. android服务绑定异步,Android中异步类AsyncTask用法总结

    本文总结分析了Android中异步类AsyncTask用法.分享给大家供大家参考,具体如下: 最近整理笔记的时候,看到有关AsyncTask不是很理解,重新疏导了一下,有在网上找了一些资料,个人不敢独 ...

  2. 译文:Android中糟糕的AsyncTask之停止AsyncTask操作

    译文:Android中糟糕的AsyncTask NOV 8TH, 2014 AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合.其实AsyncTask并不是那么好,甚 ...

  3. Android中的多线程编程与异步处理

    Android中的多线程编程与异步处理 引言 在移动应用开发中,用户体验是至关重要的.一个流畅.高效的应用能够吸引用户并提升用户满意度.然而,移动应用面临着处理复杂业务逻辑.响应用户输入.处理网络请求 ...

  4. Android中的线程

    1.Android中的线程概括 线程与进程 线程:线程是CPU调度的最小单元,同时线程也是一种有限的系统资源,即线程不可能无限制的产生,并且线程的创建和销毁有开销 进程:一般指一个执行单元,在pc和移 ...

  5. Android中的AsyncTask异步任务的简单实例

    在  Android中的AsyncTask异步任务的简单介绍 一文中,已经对 安卓 异步任务操作做了简单的介绍,这里,直接将上文中的异步任务做了一个实例,实现异步操作更新UI线程,相比开启子线程更新来 ...

  6. Android中的AsyncTask异步任务的简单介绍

    事件原由: 很多耗时的资源在安卓客户端加载时,必须要开启一个新的线程去操作维护,而如果直接在主线程中加载的话,客户端会直接报出异常,导致程序不能正常使用,而子线程无法直接更新UI,因此客户端提供了   ...

  7. 【Android 异步操作】AsyncTask 异步任务 ( AsyncTask 异步任务执行方法 execute 方法相关源码解析 )

    文章目录 一.AsyncTask 异步任务执行方法 execute() 引入 二.AsyncTask 异步任务执行方法 execute() 三.sDefaultExecutor 线程池解析 四.exe ...

  8. Android中使用Handler和异步任务(AsyncTack)来为UI线程执行费时操作

    出于性能优化的考虑,Android的UI线程不是线程安全的.这致使我们不能在Android的UI线程中执行一些费时的操作,如下载.刷新等.Android中只允许UI线程对Activity中的UI组件进 ...

  9. Android 中的线程及 AsyncTask(线程形态之一)解析一下

    科普一下 线程是操作系统调度的最小单元. 线程在android中是一个很重要的概念. 主线程 也叫 UI 线程 作用: 运行四大组件以及处理他们和用户交互. 子线程 作用; 执行耗时任务. 比如 I/ ...

最新文章

  1. 异常处理 课后作业2
  2. Noip2012同余方程
  3. python里的关键字有哪些_Python中的yield关键字做了什么?
  4. java xml 合并_Java中合并XML文档的设计与实现
  5. python 释放内存_学了4年C++后,我转向了Python
  6. jquery实现图片放大效果
  7. 移动端的推拉效果导航菜单-支持响应式及其多层菜单
  8. 解决Vscode提示bodyparser已被弃用的问题
  9. HBase的RowKey设计
  10. PhpSpreadsheet使用
  11. kmo检验和bartlett球形检验_互助问答59期:多期DID平行趋势检验以及因子分析累计方差贡献率...
  12. monkey入门研究
  13. [node] 对某网站的简单爬虫
  14. 无法查看MSN聊天记录 总弹出下载.xml文件的对话框
  15. 华为云会议的前世今生
  16. Mac 激活win10-报错:所请求的操作需要提升特权
  17. 怎么判断两个多项式互素_多项式互素的等价条件
  18. tp路由服务器无响应,路由器无法PPPOE链接上网老显示服务器无响应
  19. 【机器学习笔记】【决策树】【泰坦尼克号幸存者的预测】
  20. 0.96OLED图标取模,包括信号图标,蓝牙图标,闹钟,电池

热门文章

  1. matlab解调2fsk,2FSK调制解调系统的MATLAB实现
  2. CF1016G. Appropriate Team(Pollard-pho,FWT,数论)
  3. 博弈论(基础概念+例题)
  4. cf 1511 D. Min Cost String
  5. 疾病预测和天气分析练习赛
  6. P7854-「EZEC-9」GCD Tree【构造】
  7. P6097-[模板]子集卷积
  8. jzoj3889-序列问题【dp,高精度】
  9. 【模板】一维树状数组
  10. 【二分】Distinct