asynctask

Android中后台线程如何与UI线程交互

半世苍凉 提交于 2020-03-31 06:43:35
我想关于这个话题已经有很多前辈讨论过了。今天算是一次学习总结吧。 在android的设计思想中,为了确保用户顺滑的操作体验。一些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务。因此我们必须要重新开启一个后台线程运行这些任务。然而,往往这些任务最终又会直接或者间接的需要访问和控制UI控件。例如访问网络获取数据,然后需要将这些数据处理显示出来。就出现了上面所说的情况。原本这是在正常不过的现象了,但是android规定除了UI线程外,其他线程都不可以对那些UI控件访问和操控。为了解决这个问题,于是就引出了我们今天的话题。Android中后台线程如何与UI线程交互。 据我所知android提供了以下几种方法,用于实现后台线程与UI线程的交互。 1、handler 2、Activity.runOnUIThread(Runnable) 3、View.Post(Runnable) 4、View.PostDelayed(Runnabe,long) 5、AsyncTask 方法一:handler handler是android中专门用来在线程之间传递信息类的工具。 要讲明handler的用法非常简单,但是我在这里会少许深入的讲一下handler的运行机制。 为了能够让handler在线程间传递消息,我们还需要用到几个类。他们是looper,messageQueue,message。

Android中后台线程如何与UI线程交互

一个人想着一个人 提交于 2020-03-23 06:09:40
我想关于这个话题已经有很多前辈讨论过了。今天算是一次学习总结吧。 在android的设计思想中,为了确保用户顺滑的操作体验。一些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务。因此我们必须要重新开启一个后台线程运行这些任务。然而,往往这些任务最终又会直接或者间接的需要访问和控制UI控件。例如访问网络获取数据,然后需要将这些数据处理显示出来。就出现了上面所说的情况。原本这是在正常不过的现象了,但是android规定除了UI线程外,其他线程都不可以对那些UI控件访问和操控。为了解决这个问题,于是就引出了我们今天的话题。Android中后台线程如何与UI线程交互。 据我所知android提供了以下几种方法,用于实现后台线程与UI线程的交互。 1、handler 2、Activity.runOnUIThread(Runnable) 3、View.Post(Runnable) 4、View.PostDelayed(Runnabe,long) 5、AsyncTask 方法一:handler handler是android中专门用来在线程之间传递信息类的工具。 要讲明handler的用法非常简单,但是我在这里会少许深入的讲一下handler的运行机制。 为了能够让handler在线程间传递消息,我们还需要用到几个类。他们是looper,messageQueue,message。

Android异步任务(AsyncTask)的设计思想

自作多情 提交于 2020-03-23 02:10:51
3 月,跳不动了?>>> AsyncTask在Android十分常用,那为什么如此常用呢,不用行不行呢,内部又是怎么实现的呢,为什么Java的API中没有这个类呢,看完本文后,你将会知道答案。 这里说有设计思想是我根据查看Android源代码提炼出来的代码逻辑,所以不会跟Google工程师的原始设计思想100%符合(也有可能是0%),但是本文一定可以帮助你理解AsyncTask,也可能有一些你以前没有发现的内容。 大家都知道,Android的主线程(又叫UI线程,线程ID为1)有一些限制策略,使得主线程有些事做不了,比如访问网络就不允许,否则就是报,但在2.3之后的版本,你可以通过添加以下代码更改其限制策略,从而强制使得主线程可以访问网络: if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); } 不过StrictMode是一个开发工具主要用于侦测主线程中的磁盘和网络访问,而不是让你做这“坏”事,其实Android这样限制是有好处的,强制让开发者重视用户体验,一个反面例子是Windows

使用AsyncTask类实现简单的异步处理操作

本小妞迷上赌 提交于 2020-03-20 05:03:36
AsyncTask: 1.这是一种相比Handler更轻量级的处理异步任务的工具类 2.它和Handler类一样,都是为了不影响主线程(UI)而使用的((注:UI的更新只能在主线程中完成) 3.这个工具类提供了三个泛型的参数: params:启动或执行任务的输入参数,例如:HTTP请求的URL Progress:后台任务执行的百分比 Result:后台执行任务最终返回的结果,比如String 使用AsyncTask最少要重写这两个方法: 1.doInBackground(params··)   此方法在后台执行,比较耗时的操作都可以放在这里执行;   这里不能直接操作UI(主线程),此方法在后台线程执行;完成任务的主要工作,通常需要很长世间;   在此执行过程中可以调用publishProgress()来更新工作进度。 2.onPostExecute(Result)   相当于Handler处理UI的方式;   可以使用在doInBackground得到的结果处理和操作UI;   此方法在主线程中执行,任务执行的结果作为参数的返回。 如果有必要还可以重写一下三个方法: onProgressUpdate();   这里可以使用进度条来显示任务执行的进度情况,用来增加用户体验。(此方法在主线程中执行) onPreExecute();   这里是用户调用Execute的接口

asynctask部分--耗时操作的封装

喜你入骨 提交于 2020-03-01 10:52:38
1、简介 asynctask部分,主要使用了模版方法,对asynctask类的封装,主要是简化了耗时操作的写法,原本的耗时操作需要在线程中执行,然后如果在线程中需要更新UI的话,得用Handler提交给UI线程执行。下面是未使用的代码写法: private Handler handler = new Handler(); ...... new Thread() { @Override public void run() { String resultStr = null; try { resultStr = doHttpOperation();//Http耗时操作获取资源结果 } catch (Exception e) { } //耗时操作完成后更新UI,给TextView设置结果 handler.post(new Runnable(){ @Override public void run(){ textView.setText(resultStr);//更新UI,需要在UI线程中操作 } }; );} }.start(); 2、 asynctask部分的使用详解 (1)首先,定义一个类,继承AbstractTask。如下面的代码: public class GetUserTask extends AbstractTask<String> { public GetUserTask

[Android] AsyncTask详解

吃可爱长大的小学妹 提交于 2020-03-01 10:42:51
本篇随笔将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信。 一、Android当中的多线程 在Android当中,当一个应用程序的组件启动的时候,并且没有其他的应用程序组件在运行时,Android系统就会为该应用程序组件开辟一个新 的线程来执行。默认的情况下,在一个相同Android应用程序当中,其里面的组件都是运行在同一个线程里面的,这个线程我们称之为Main线程。当我们 通过某个组件来启动另一个组件的时候,这个时候默认都是在同一个线程当中完成的。当然,我们可以自己来管理我们的Android应用的线程,我们可以根据 我们自己的需要来给应用程序创建额外的线程。 二、Main Thread 和 Worker Thread 在Android当中,通常将线程分为两种,一种叫做Main Thread,除了Main Thread之外的线程都可称为Worker Thread。 当一个应用程序运行的时候,Android操作系统就会给该应用程序启动一个线程,这个线程就是我们的Main Thread,这个线程非常的重要,它主要用来加载我们的UI界面,完成系统和我们用户之间的交互,并将交互后的结果又展示给我们用户,所以Main Thread又被称为UI Thread。 Android系统默认不会给我们的应用程序组件创建一个额外的线程

asyncTask详解

浪尽此生 提交于 2020-03-01 06:35:54
介绍 android UI是线程不安全的,因此想实现在子线程中刷新UI就需要借助一些机制来实现,一般有两种方法:handler+message;还有一种就是今天我们要讲的asyncTask。asyncTask相对 handler+message 要轻量级一些。 基本用法 asyncTask 是一个抽象类,因此我们需要自定义一个类来继承他,并且实现他的方法。 asyncTask 指定了三个泛型参数,其中Params是可变长的泛型参数,三个参数用法如下: Params: asyncTask 传入的参数可在后台执行任务时使用 Progress:后台执行任务时,如果需要在前台显示进度,这里是指定泛型作为进度单位 Result:后台执行任务完成,如果需要返回结果到前台,这里是指定泛型作为返回值类型 除了参数下面介绍下我们经常需要重写的四个方法: onPreExecute():在任务执行之前调用,进行一些初始化操作,比如显示一个进度条,这个方法是在主线程运行的。 doInBackground(Void... arg0):这个方法是用来执行耗时操作的,把你想要异步处理的任务的代码放在这里面,这个肯定是在子线程执行的。所以这个方法里面不能进行UI操作,如果想要更新UI的话,比如更新进度可以调用publishProgress(values)方法。 onProgressUpdate(Integer..

Android 多线程----AsyncTask异步任务详解

夙愿已清 提交于 2020-02-29 08:48:04
【声明】 欢迎转载,但请保留文章原始出处→_→ 生命壹号: http://www.cnblogs.com/smyhvae/ 文章来源: http://www.cnblogs.com/smyhvae/p/3866570.html 【正文】 本文将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信。 一、Android当中的多线程: 在Android当中,当一个应用程序的组件启动的时候,并且没有其他的应用程序组件在运行时,Android系统就会为该应用程序组件开辟一个新的线程来执行。默认的情况下,在一个相同Android应用程序当中,里面的组件都是运行在同一个线程里的,这个线程称之为Main线程。当我们通过某个组件来启动另一个组件的时候,这个时候默认都是在同一个线程当中完成的。当然,我们可以自己来管理我们的Android应用的线程,我们可以根据我们自己的需要来给应用程序创建额外的线程。 二、Main Thread 和 Worker Thread: 在Android当中,通常将线程分为两种,一种叫做Main Thread,除了Main Thread之外的线程都可称为Worker Thread。 当一个应用程序运行的时候,Android操作系统就会给该应用程序启动一个线程,这个线程就是我们的Main Thread,这个线程非常重要

Android中探究服务

。_饼干妹妹 提交于 2020-01-31 04:23:34
服务是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖任何用户界面,即使程序被切换到后台,或者用户打印了另一个应用程序,服务仍然能够保持正常运行。 注意的是服务并不是运行在一个独立的进场当中的,而是依赖与创建服务时所在的应用程序进程。当某应用程序进程被杀掉时,所有依赖于该进程的服务也会停止运行 另外,也不要被服务的后台概念所迷惑,实际上服务并不会自动开启线程,所有的代码都是默认运行在主线程当中。也就是说我们需要在服务的内部手动创建子线程。,并在这里执行具体任务,否则就出现主线程被阻塞的情况。 1.Android多线程编程 线程基本用法: 定义一个线程只需要新建一个类继承自Thread,然后重写父类的run()方法,并在里面编写耗时逻辑即可。 class MyThread extends Thread{ public void run(){ //处理具体逻辑 } } 启动线程:一般new出一个MyThread的实例,然后调用start()方法。代码如下: new MyThread().start(); 使用继承的方式耦合性有点高,更多的时候我们都会选择使用实现Runnable接口的方式来定义一个线程,如下 class MyThread implements Runnable{ public void run()

Spring框架中的异步执行

时光怂恿深爱的人放手 提交于 2020-01-14 02:08:08
一、Spring框架中的异步执行 在Spring Framework中分别使用TaskExecutor和TaskScheduler接口提供异步执行和任务调度的抽象,本节我们着重讲解基于TaskExecutor支撑的的注解@Async如何实现异步处理的。 二、 @Async注解异步处理原理 在Spring中可以在方法上添加@Async注释,以便异步调用该方法。换句话说,调用者将在调用含有@Async注释的方法时立即返回,并且该方法的实际执行将发生在Spring TaskExecutor异步处理器线程中。需要注意的是该注解@Async默认是不会解析的,SpringBoot中需要加上@EnableAsync来启动。 下面我们看如何使用@Async注解进行异步处理,如下代码: @Async public void dosomthingAsync() { System.out.println("--dosomthingAsync begin---"); // 模拟异步处理 try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("--dosomthingAsync end---"); } 如上代码在方法dosomthingAsync上添加了