博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android的AsyncTask类的简单教程
阅读量:6226 次
发布时间:2019-06-21

本文共 4105 字,大约阅读时间需要 13 分钟。

hot3.png

首先介绍AsyncTask中定义的以下几个方法:

onPreExecute():该方法在执行后台操作前被UI线程调用,可以做一些准备工作,如图片加载之前先显示进度条等

doInBackground(Params...):该方法运行在后台线程中,比较耗时的操作可以写在此方法中

onProgressUpdate(Progress...):该方法只有在doInBackground(Params...)方法中调用了publishProgress()方法时候才会执行,用来显示后台任务的进展情况

onPostExecute(Result): doInBackground(Params...)方法执行完毕以后,此方法会被UI线程调用,可以在此方法中对UI进行操作,比如显示图片内容等。

----------------------------------------------------------

其次是AsyncTask中的三个参数 :

Params 启动任务执行的输入参数,比如HTTP请求的URL。       

Progress 后台任务执行的进度值。        

Result 后台执行任务最终返回的结果。

------------------------------------------------------------------

最后用一个异步加载网络图片的实例更好的体现AsyncTask的作用:

新建一个空的Android项目工程,我新建的是AsyncTaskTest,

先贴出项目最终的运行效果图啦:

172511_8KLE_2391602.png

然后修改main_activity.xml的代码,如下:

    
    

由此可知,主布局并不复杂,LinearLayout里嵌套一个Button,和引用一个名字叫layout.xml的文件。

效果图如下:

172621_J2X5_2391602.png

那么问题来了,layout.xml文件是何方神圣呢?

你们可以猜猜,也可以自己动手吧。(文章尾处有惊喜哦、)

 

主活动类MainActivity.java的代码修改如下:

package com.yaowen.asynctasktest;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.ProgressBar;import java.io.BufferedInputStream;import java.io.IOException;import java.io.InputStream;import java.net.URL;import java.net.URLConnection;public class MainActivity extends AppCompatActivity {    private Button downBitmap;    private ProgressBar progressBar;    private ImageView imageView;    //将要异步加载的图片的地址,这里我用的自己搭建的服务器上图片的地址啦    private static final String URL_PATH = "http://192.168.3.200:8080/mytest/1.jpg";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        // new MyAsyncTask().execute(URL1);    }    /**     * 初始化所有UI控件     **/    private void initView() {        downBitmap = (Button) findViewById(R.id.btn_test);        progressBar = (ProgressBar) findViewById(R.id.progressBar1);        imageView = (ImageView) findViewById(R.id.imageView);        downBitmap.setOnClickListener(new Listener());    }    /**     * 按钮事件响应类,用于启动MyAsyncTask类异步加载并显示图片     **/    class Listener implements View.OnClickListener {        @Override        public void onClick(View v) {            if (v.getId() == R.id.btn_test) {                //这里启动MyAsyncTask类异步加载并显示图片                new MyAsyncTask().execute(URL_PATH);            }        }    }    /**     * 自定义异步任务类     *     * @author YAOWEN     * @String 传入的参数为图片的URL地址,String类型,     * @Void 进度值先不考虑所以返回为空,     * @Bitmap 后台执行任务最终返回的结果为一张图片Bitmap类型     */    class MyAsyncTask extends AsyncTask
 {        @Override        protected void onPreExecute() {//后台没有运行完毕之前做的准备工作,在这我们让原本隐藏的progressBar显示            super.onPreExecute();            progressBar.setVisibility(View.VISIBLE);//后台运行的时候进度条显示        }        @Override        protected Bitmap doInBackground(String... params) {//在后台进行网络访问,得到图片并返回            String url = params[0];            Bitmap bitmap = null;            URLConnection connection;//定义网络连接对象            InputStream inputStream;            try {                connection = new URL(url).openConnection();                inputStream = connection.getInputStream();                BufferedInputStream bis = new BufferedInputStream(inputStream);                //将输入流解析成Bipmap                bitmap = BitmapFactory.decodeStream(bis);                inputStream.close();                bis.close();            } catch (IOException e) {                e.printStackTrace();            }            return bitmap;        }        @Override        protected void onPostExecute(Bitmap bitmap) {//在此方法中接收后台返回的Bitmap值并且设置到UI            super.onPostExecute(bitmap);            progressBar.setVisibility(View.GONE); //显示的progressBar再设置为隐藏            imageView.setImageBitmap(bitmap); //在片此方法中设置UI线程显示图        }    }}

代码为了可读性,我特意加入了注释,这样子便于一些初学者读懂代码吧~~~~~~

 

上面说到了文章尾处有惊喜,所以叫layout.xml的文件原来是这个“妖孽”!

    
    

也不复杂啦,相信大家都能想出来了!!!!

最后,祝大家学有所成~!

 

转载于:https://my.oschina.net/yaowen424/blog/527045

你可能感兴趣的文章
C#设计模式系列:代理模式(Proxy)
查看>>
javaEE项目建立多个数据源并配置事务
查看>>
python-字符串格式化
查看>>
DNS配置笔记
查看>>
Chrome自定义最小字号
查看>>
Android多人视频聊天应用的开发(一)快速集成
查看>>
谷歌web站点安全扫描软件skipfish安装、配置、使用
查看>>
Centos 中如何快速定制二进制的内核 RPM 包
查看>>
zabbix 自动发现tomcat的war包并实现监控
查看>>
网络安全简介
查看>>
Nginx基本概念和安装
查看>>
我的友情链接
查看>>
10年以后第一次做作业的感受
查看>>
SpannableString与SpannableStringBuilder使用
查看>>
fastreport打印,设置
查看>>
如何批量导出已经开通Lync权限的用户
查看>>
C#4.0的dynamic和var及object关键字辨析
查看>>
C# 中的委托和事件
查看>>
Ajax筛选检索Filter高级插件(OpenCart)
查看>>
开发和运维那点事
查看>>