1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > AndroidStudio_安卓原生开发_AsyncTask异步处理使用_AsyncTaskLoader---Android原生开发工作笔记139

AndroidStudio_安卓原生开发_AsyncTask异步处理使用_AsyncTaskLoader---Android原生开发工作笔记139

时间:2024-06-22 10:18:27

相关推荐

AndroidStudio_安卓原生开发_AsyncTask异步处理使用_AsyncTaskLoader---Android原生开发工作笔记139

为什么这里要说一下AsyncTask,因为之前写程序都用Handler来做

上面这样用Handler来做的时候,后来发现,程序运行的过程中,由于线程的问题,出现了一些问题,比如

操作过程中有可能会崩溃等.

用AsyncTask执行,异步操作可能会好一些.android原生提供,执行以后可以通知UI线程更新UI

通过AsyncTask可以实现

实现多线程

在工作线程中执行任务,如 耗时任务异步通信、消息传递

实现工作线程 & 主线程(UI线程)之间的通信,即:将工作线程的执行结果传递给主线程,从而在主线程中执行相关的UI操作,从而保证线程安全可以看看这个AsyncTask类

public abstract class AsyncTask<Params, Progress, Result> { ... }// 类中参数为3种泛型类型// 整体作用:控制AsyncTask子类执行线程任务时各个阶段的返回类型// 具体说明:// a. Params:开始异步任务执行时传入的参数类型,对应excute()中传递的参数// b. Progress:异步任务执行过程中,返回下载进度值的类型// c. Result:异步任务执行完成后,返回的结果类型,与doInBackground()的返回值类型保持一致// 注:// a. 使用时并不是所有类型都被使用// b. 若无被使用,可用java.lang.Void类型代替// c. 若有不同业务,需额外再写1个AsyncTask的子类}

4.他有以下的方法

5.然后调用顺序是这样的:

然后我们去写一个例子看看

1.创建AsyncTask子类 & 根据需求实现核心方法

/*** 步骤1:创建AsyncTask子类* 注: * a. 继承AsyncTask类* b. 为3个泛型参数指定类型;若不使用,可用java.lang.Void类型代替* c. 根据需求,在AsyncTask子类内实现核心方法*/private class MyTask extends AsyncTask<Params, Progress, Result> {....// 方法1:onPreExecute()// 作用:执行 线程任务前的操作// 注:根据需求复写@Overrideprotected void onPreExecute() {...}// 方法2:doInBackground()// 作用:接收输入参数、执行任务中的耗时操作、返回 线程任务执行的结果// 注:必须复写,从而自定义线程任务@Overrideprotected String doInBackground(String... params) {...// 自定义的线程任务// 可调用publishProgress()显示进度, 之后将执行onProgressUpdate()publishProgress(count);}// 方法3:onProgressUpdate()// 作用:在主线程 显示线程任务执行的进度// 注:根据需求复写@Overrideprotected void onProgressUpdate(Integer... progresses) {...}// 方法4:onPostExecute()// 作用:接收线程任务执行结果、将执行结果显示到UI组件// 注:必须复写,从而自定义UI操作@Overrideprotected void onPostExecute(String result) {...// UI操作}// 方法5:onCancelled()// 作用:将异步任务设置为:取消状态@Overrideprotected void onCancelled() {...}}/*** 步骤2:创建AsyncTask子类的实例对象(即 任务实例)* 注:AsyncTask子类的实例必须在UI线程中创建*/MyTask mTask = new MyTask();/*** 步骤3:手动调用execute(Params... params) 从而执行异步线程任务* 注:* a. 必须在UI线程中调用* b. 同一个AsyncTask实例对象只能执行1次,若执行第2次将会抛出异常* c. 执行任务中,系统会自动调用AsyncTask的一系列方法:onPreExecute() 、doInBackground()、onProgressUpdate() 、onPostExecute() * d. 不能手动调用上述方法*/mTask.execute();

创建AsyncTask子类的实例对象(即 任务实例)手动调用execute(()从而执行异步线程任务

3.上面是介绍,然后我们再去写个例子去看看:

6. 实例讲解

下面,我将用1个实例讲解 具体如何使用AsyncTask

6.1 实例说明

点击按钮 则 开启线程执行线程任务显示后台加载进度加载完毕后更新UI组件期间若点击取消按钮,则取消加载

如下图

示意图

6.2 具体实现

建议先下载源码再看:Carson_Ho的Github地址:AsyncTask

主布局文件:activity_main.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"tools:context="com.example.carson_ho.handler_learning.MainActivity"><Buttonandroid:layout_centerInParent="true"android:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="点我加载"/><TextViewandroid:id="@+id/text"android:layout_below="@+id/button"android:layout_centerInParent="true"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="还没开始加载!" /><ProgressBarandroid:layout_below="@+id/text"android:id="@+id/progress_bar"android:layout_width="fill_parent"android:layout_height="wrap_content"android:progress="0"android:max="100"style="?android:attr/progressBarStyleHorizontal"/><Buttonandroid:layout_below="@+id/progress_bar"android:layout_centerInParent="true"android:id="@+id/cancel"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="cancel"/></RelativeLayout>

主逻辑代码文件:MainActivity.java

public class MainActivity extends AppCompatActivity {// 线程变量MyTask mTask;// 主布局中的UI组件Button button,cancel; // 加载、取消按钮TextView text; // 更新的UI组件ProgressBar progressBar; // 进度条/*** 步骤1:创建AsyncTask子类* 注:* a. 继承AsyncTask类* b. 为3个泛型参数指定类型;若不使用,可用java.lang.Void类型代替*此处指定为:输入参数 = String类型、执行进度 = Integer类型、执行结果 = String类型* c. 根据需求,在AsyncTask子类内实现核心方法*/private class MyTask extends AsyncTask<String, Integer, String> {// 方法1:onPreExecute()// 作用:执行 线程任务前的操作@Overrideprotected void onPreExecute() {text.setText("加载中");// 执行前显示提示}// 方法2:doInBackground()// 作用:接收输入参数、执行任务中的耗时操作、返回 线程任务执行的结果// 此处通过计算从而模拟“加载进度”的情况@Overrideprotected String doInBackground(String... params) {try {int count = 0;int length = 1;while (count<99) {count += length;// 可调用publishProgress()显示进度, 之后将执行onProgressUpdate()publishProgress(count);// 模拟耗时任务Thread.sleep(50);}}catch (InterruptedException e) {e.printStackTrace();}return null;}// 方法3:onProgressUpdate()// 作用:在主线程 显示线程任务执行的进度@Overrideprotected void onProgressUpdate(Integer... progresses) {progressBar.setProgress(progresses[0]);text.setText("loading..." + progresses[0] + "%");}// 方法4:onPostExecute()// 作用:接收线程任务执行结果、将执行结果显示到UI组件@Overrideprotected void onPostExecute(String result) {// 执行完毕后,则更新UItext.setText("加载完毕");}// 方法5:onCancelled()// 作用:将异步任务设置为:取消状态@Overrideprotected void onCancelled() {text.setText("已取消");progressBar.setProgress(0);}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 绑定UI组件setContentView(R.layout.activity_main);button = (Button) findViewById(R.id.button);cancel = (Button) findViewById(R.id.cancel);text = (TextView) findViewById(R.id.text);progressBar = (ProgressBar) findViewById(R.id.progress_bar);/*** 步骤2:创建AsyncTask子类的实例对象(即 任务实例)* 注:AsyncTask子类的实例必须在UI线程中创建*/mTask = new MyTask();// 加载按钮按按下时,则启动AsyncTask// 任务完成后更新TextView的文本button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {/*** 步骤3:手动调用execute(Params... params) 从而执行异步线程任务* 注:* a. 必须在UI线程中调用* b. 同一个AsyncTask实例对象只能执行1次,若执行第2次将会抛出异常* c. 执行任务中,系统会自动调用AsyncTask的一系列方法:onPreExecute() 、doInBackground()、onProgressUpdate() 、onPostExecute()* d. 不能手动调用上述方法*/mTask.execute();}});cancel = (Button) findViewById(R.id.cancel);cancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 取消一个正在执行的任务,onCancelled方法将会被调用mTask.cancel(true);}});}}

运行结果

示意图

源码地址

Carson_Ho的Github地址:AsyncTask

链接:/p/ee1342fcf5e7

AsyncTaskLoader 这个没有说,这个也是实现的TsyncTask,相当于又封装了一层,用到的时候,

再去看也可以。

技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152 CSDN账号:credreamer 开通了个人技术微信公众号:credream,有需要的朋友可以添加相互学习

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。