Android中异步任务AsyncTask的使用

【Android 】零基础到飞升 | AsyncTask异步任务 3.7 AsyncTask异步任务 分类 Android 基础入门教程 本节引言: 本节给大家带来的是Android给我们提供的一个轻量级的用于处理异步任务的类:AsyncTask,我们一般是 继承AsyncTask,然后在类中实现异步操作,然后将异步执行的进度,反馈给UI主线程~ 好吧,可能有些概念大家不懂,觉得还是有必要讲解下多线程的概念,那就先解释下一些概念性的东西吧! 1.相关概念 1)什么是多线程: 答:先要了解这几个名称... 阅读详情

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"?>
<LinearLayout
    xmlns: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">

    <Button
        android:id="@+id/down_load"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="下载图片"/>

    <ImageView
        android: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";

    @Override
    protected 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);
    }

    @Override
    public void onClick(View view) {
        new DownLoadImageTask().execute(path);
    }


    private class DownLoadImageTask extends AsyncTask<String, Integer, Bitmap> {
        @Override
        protected void onPreExecute() {
            dialog.show();
            super.onPreExecute();
        }

        @Override
        protected 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 block
                    e.printStackTrace();
                }
            }
            return bitmap;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            dialog.setProgress(values[0]);
            super.onProgressUpdate(values);
        }

        @Override
        protected 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;
    }
}

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

给大一新生的蓝桥杯EDA备赛规划:从电路分析到立创EDA,如何用一年时间高效备赛? 本文为大一新生提供了一份系统的蓝桥杯EDA备赛规划,从电路分析基础到立创EDA实战操作,分阶段指导如何高效备赛。内容涵盖理论学习、软件操作、PCB设计专项提升及冲刺优化策略,帮助学生在一年内全面提升电子设计能力,为竞赛做好充分准备。 阅读详情

相关推荐

中科蓝讯(第一次使用指南)

中科蓝讯 新手指南

qq_48579018的博客 1万+

AsyncTask网络请求

package bwei.com.day0511_demo123.fragments; import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import androi...

chenyibai的博客 781

Veeam Backup Replication Console 13 备份 PVE

本文介绍了如何通过Veeam Backup & Replication控制台配置与Proxmox VE(PVE)服务器的连接,包括主机地址、用户名密码和SSH信任设置。随后详细说明了部署备份Worker虚拟机的步骤,涵盖网络配置和VM创建。接着指导用户创建PVE虚拟机备份任务,包括命名、选择备份对象、存储位置、备份类型设置,以及配置备份计划任务。最后描述了备份测试执行过程,从启动备份到完成状态通知的完整流程。整个操作涉及服务器连接、Worker部署、备份配置和任务执行四个主要环节。

极致,细节 1608

AsyncTask实现异步网络请求

main主方法 public class MainActivity extends AppCompatActivity { private ListView lv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstan...

酒醉奈何橋 927

ICT调试技巧:从基础到实战的全面指南

本文提供了一份全面的ICT调试技巧指南,涵盖从基础认知到实战应用的全过程。详细解析了ICT设备硬件结构、程序文件构成,并重点讲解了调试界面的核心参数与高效快捷键。通过跳线、电阻、电容及二极管等常见元器件的实战调试案例,分享了参数设置要点与典型问题解决方案,帮助工程师快速掌握ICT调试核心技能,提升测试效率与准确性。

weixin_29202213的博客 344

linux驱动由浅入深系列:基于高通平台分析触摸屏(TP)、虚拟按键驱动

触摸屏的触摸板(touch panel简称TP)驱动的基本架构和普通按键驱动基本一致,可以参考文章:linux驱动由浅入深系列:输入子系统之二(编写一个gpio_key驱动)。只是其功能稍稍复杂些,配置也多些,下面一起来看一下。 TP包括 触摸屏、虚拟按键、虚拟按键背光灯 TP驱动芯片厂商主要有:Goodix(汇顶),FocalTech(敦泰科技),cypress(赛普拉斯),synapt

Radia的专栏 4770

Android-AsyncTask异步任务(一)

需求:使用AsyncTask异步任务,下载网络图片 一、在主线程中操作耗时任务会导致异常 因为在新版Android平台不允许直接在UI线程中建立网络连接、访问网络资源。在UI线程中操作耗时任务(访问网络),将会导致android.os.NetworkOnMainThreadException异常。 1、在AndroidManifest.xml中添加网络授权 <uses-perm...

往事似水拂流年的博客 1464

Day 01: 与Python的第一次亲密接触

环境搭建 、第一个程序 Hello, World!、以及Python之禅 (The Zen of Python) 的解读。

杨小扩的博客 220

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

AsyncTask类简单介绍 Android从1.5开始引入了AsyncTask这个类,AsyncTask内部使用Java 1.5的并发库比普通初级Android开发者编写的Thread+Handler稳定很多 AsyncTask封装了Thread和Handler,使我们用起来更加方便,不用去关注Handler。由于后台线程不能更新UI,而很多情况下,我们在后台线程做完一件事后,一般都会更新UI,一

it_Y的博客 5452

【WorkBuddy专栏61】字节的AI打法为什么一直在变——WorkBuddy/CodeBuddy vs 字节Trae/TRAE Work/豆包全维度对比

【WorkBuddy专栏61】字节的AI打法为什么一直在变——WorkBuddy/CodeBuddy vs 字节Trae/TRAE Work/豆包全维度对比

AI人人懂 2782

五万字解析【ROOT 入门指南】

本文是cern官方root入门指南的初步翻译版,还在进一步校对中....

荷塘阅色 210

使用AsyncTask来封装网络请求的问题总结

需求背景 项目没有使用成熟的第三方网络库(如Volley、Retrofit),而是使用为AsyncTask封装每一个网络请求API。 现在需要统一处理“未登录”的错误,即任意网络请求返回“未登录”错误时,能够被业务层代码捕获并处理。 但是之前的封装没有对应的钩子函数能够将错误交由业务逻辑层做统一的处理,或者写一个BaseAsyncTask来统一处理。 解决方案 注意到: 项目中所有的...

雪诺秋的博客 625

FineReport实战-- 国内外各地区销售数据分析 多个图表联动

进行国内外各地区业务员销售数据分析是一项复杂但极具价值的任务,它可以帮助企业了解不同市场的表现,并据此调整销售策略以提高整体绩效。实现功能:同一个报表里面多个图表联动问题。

Davina_yu的博客 1201

Android 之 AsyncTask 异步任务

答:先要了解这几个名称:应用程序,进程,线程,多线程!!应用程序(Application):为了完成特定任务,用某种语言编写的一组指令集合(一组静态代码)进程(Process)运行中的程序,系统调度与资源分配的一个独立单位,操作系统会为每个进程分配 一段内存空间,程序的依次动态执行,经理代码加载 -> 执行 -> 执行完毕的完整过程!线程(Thread):比进程更小的执行单元,每个进程可能有多条线程,线程需要放在一个进程中才能执行!线程是由程序负责管理的!!!而进程则是由系统进行调度的!!!

leyang0910的博客 1387

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

安卓的异步任务AsyncTask

第二个泛型用来限制onProgressUpdate(Progress)和publishProgress(Progress)方法传入参数的类型,在publishProgress方法中传入的参数会在onProgressUpdate回调方法中被使用。第一个泛型用来限制execute(Params)和doInBackground(Params)方法传入参数的类型,在execute方法中传入的参数会在doInBackground回调方法中被使用。广泛地讲异步任务就是以多线程的方式完成的功能需求,相对于同步。

weixin_71792169的博客 736

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

安卓 AsyncTask 异步任务

安卓异步任务实验代码(未修改)xmljava 实验代码(未修改) xml <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" x

Sun_XiaoChuan的博客 1793

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android异步任务AsyncTask的使用与原理分析

在上一篇文章《Android缓存机制&一个缓存框架推荐》中说到,在了解了Android缓存机制后我准备自己动手写一个LruCache和DiskLruCache二级缓存的轻量级的图片请求框架,在思考如何搭建这个框架时,纠结于用何种方式去下载图片,是直接new出一个线程呢,还是用看起来稍微高大上档次一点的AsyncTask异步任务来处理?思来想去,还是虚荣心作怪,还是用AsyncTask吧,正好这个工

开心阳 1万+

【Android】AsyncTask异步任务

文章目录AsyncTask异步任务本节引言1.相关概念1)什么是多线程2)同步与异步的概念3) Android 为什么要引入异步任务2.AsyncTask全解析1)为什么要用AsyncTask?2)AsyncTask的基本结构3.AsyncTask使用示例 AsyncTask异步任务 本节引言 本节给大家带来的是Android给我们提供的一个轻量级的用于处理异步任务的类:AsyncTask,我们一般是 继承AsyncTask,然后在类中实现异步操作,然后将异步执行的进度,反馈给UI主线程~ 好吧,可能有.

懂得一千零一种,赋予你失败的方法! 748

40. 【Android教程】AsyncTask:异步任务

AsyncTask 类通常用来在执行后台任务的同时刷新 UI,通过调用execute()方法触发后台任务的执行,首先会回调 AsyncTask 的,接着回调来执行自定义的后台任务,最后回调。

这是一个web全栈开发的博客,取其精华去其糟粕,争取让大家一看就懂,一学就会,一用就成~ 2213

android异步任务 方案,Android消息机制 异步任务AsyncTask

Android消息机制一、基本使用a)概述:一个Android应用程序被创建的时候都会创建一个UI主线程,但是有时我们会有一些比较耗时的操作,为了防止阻塞UI主线程,我们会将耗时的操作放到子线程中进行处理,处理完之后操作UI,但是Android不允许子线程操作UI,违背了Android单线程模型的原则(即Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行),所有Androi...

weixin_28825959的博客 273

java安卓开发异步任务_android开发AsyncTask异步任务实例

以下是MainActivity.java中onCreate()方法中的代码:Button down = (Button)findViewById(R.id.down);final ProgressBar pbr = (ProgressBar)findViewById(R.id.progressBar);down.setOnClickListener(new View.OnClickListener...

weixin_39940770的博客 128

android 多个asynctask同步,Android-AnsyncTask异步任务的使用

在Android中实现异步任务机制有两种方式,Handler和AsyncTask。Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。关于Handler的相关知识,前面也有所介绍,不清楚的朋友们可以参照一下。为了简...

weixin_42499999的博客 478

【Android面试】Android异步任务AsyncTask

Android面试08-异步任务AsyncTaskAsyncTask是啥?AsyncTask怎么用?AsyncTask原理AsyncTask在使用中的一个特殊情况AsyncTask和Handler的比较 AsyncTask是啥? 在介绍AsyncTask之前,得先再回顾一下Handler。 众所周知,我们的ui操作需要在主线程,所以一般会先创建一个子线程,然后把耗时操作放到子线程,然后通过handler发送消息到主线程,通知主线程进行ui操作。 所以handler的步骤是: 1.主线程创建handler(接

Rose J 的博客 740

Android 异步任务AsyncTask

为避免主线程失去响应,Android把耗时的操作发在新的线程中完成 更新主线程的方法: 1.使用Handler实现线程通信 2.Activity.runOnUiThread(Runnable) 3.View.post(Runnable,long) 4.View.postDelayed(Runnable,long) 后三种编程复杂,用异步任务AsyncTask可简化,不需要借助线程和Ha

我就是王大大的博客 390

Android中异步任务机制AsyncTask的理解

在Android中实现异步任务机制有两种方式,Handler和AsyncTask。 Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。关于Handler的相关知识,前面也有所介绍,不清楚的朋友们可以参照一下

lplj717的博客 2237

Android异步任务机制—AsyncTask

AsyncTask实现的原理,和适用的优缺点AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较

程序病毒小队的博客 350
上一篇: Android中ImageView的scaleType 属性说明。
下一篇: Hibernate使用最新的MySQL8.+版本出现的问题!
JSON_ZJS
博客等级 码龄9年 30粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值