首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Asynctask:将两个或多个值从doInBackground传递给onPostExecute

在Android开发中,Asynctask是一个非常有用的工具,用于在后台线程中执行耗时操作,而不会阻塞主线程。Asynctask允许开发者将两个或多个值从doInBackground方法传递给onPostExecute方法,以便在后台任务完成后更新UI。

Asynctask的工作原理是将任务分为三个部分:doInBackground、onProgressUpdate和onPostExecute。doInBackground是在后台线程中执行的方法,它接受一个参数,并返回一个结果。onProgressUpdate是在主线程中执行的方法,用于更新UI。onPostExecute是在主线程中执行的方法,用于处理doInBackground返回的结果。

在doInBackground方法中,可以将多个值封装到一个对象中,例如使用数组或列表。然后,在onPostExecute方法中,可以解析这个对象并更新UI。

例如,以下代码演示了如何在Asynctask中将两个值从doInBackground传递给onPostExecute:

代码语言:java
复制
private class MyAsyncTask extends AsyncTask<Void, Integer, String[]> {
    @Override
    protected String[] doInBackground(Void... params) {
        // 执行耗时操作,并返回结果
        String result1 = "Hello";
        String result2 = "World";
        return new String[]{result1, result2};
    }

    @Override
    protected void onPostExecute(String[] result) {
        // 更新UI
        String result1 = result[0];
        String result2 = result[1];
        // 使用结果更新UI
    }
}

在这个例子中,doInBackground方法返回一个字符串数组,包含两个值。在onPostExecute方法中,解析这个数组并更新UI。

需要注意的是,Asynctask在Android 11中已被弃用,建议使用其他并发方法,如线程池、HandlerThread、Coroutines等。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

android异步消息机制 源码层面解析(2)

AsyncTask 什么是AsyncTask AsyncTask是一个轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和结果传递给主线程并在主线程中更新UI。...onPostExecute(Result result) 此方法在主线程中执行,在doInBackground方法执行完成以后此方法会被调用,其中result的类型就是AsyncTask传入的第三个参数类型...,它的就是doInBackground方法的返回。.../ditu.jpg"); new MyAsyncTask().execute(url); 源码分析 首先我们AsyncTask的构造方法着手。...在上面的案例中doInBackground方法里的代码将会执行,当执行到publishProgress()方法时,会不断进度信息传递给onProgressUpdate()方法(后面的分析中会解释为什么

53021
  • AsyncTask? AsyncTask串行and并行?

    使用AsyncTaskNike 以在线程池中之行后台任务,并把之行的进度和最终结果传递给UI线程做进一步的操作。...如果你有更新进度的需求,可以通过调用publishProgress方法,该方法会调用onProgresssUpdate方法,调用publishProgress方法时需要传递一个进度,该最终会在onProgresssUpdate...当然执行doInBackground时你需要返回一个结果集。该结果集最终在onPostExecute中获取。...; execute方法必须在主线程中调用; onPreExecute、onPostExecutedoInBackground、onProgressUpdate 四个方法不能在程序中直接调用; 一个AsyncTask...在如前先调用了onPreExecute()方法,在mFuture被执行的时候,会回调mWorker的call方法,call方法里会调用doInBackground方法,获得doInBackground

    1K20

    Android多线程-AsyncTaskyi(一)

    是可以选择性覆写的方法 * 在主线程中执行,在异步任务执行完成后,此方法会被调用 * 一般用于更新UI其他必须在主线程执行的操作,传递参数bitmap为 * doInBackground...方法中的返回 * @param bitmap */ @Override protected void onPostExecute(Bitmap bitmap) {...此外doInBackground方法会将计算的返回结果传递给onPostExecute方法。...(4)onPostExecute(Result), 在主线程中执行,在doInBackground 执行完成后,onPostExecute 方法将被UI线程调用,doInBackground 方法的返回将作为此方法的参数传递到...一般使用AsyncTask内部提供的线程池即可(也可以自己创建),第二个参数,就是最终会传递给doInBackground方法的可变参数,这里不,所以直接给了空白符。

    63220

    Android AsyncTask 使用与分析

    这个类能让你不主动使用多线程Handler,在UI线程进行后台操作并发布结果。 是一个在不用多线程和Handler的情况下的帮助类。AsyncTask适用于短时间的操作(最多几秒)。...这一步可以调用publishProgress(Progress...)通知出去一个多个进度。这些进度会被onProgressUpdate(Progress...)在UI线程收到。...调用这个方法后,后台任务doInBackground(Object[])执行完毕后会调用onCancelled(Object)而不再是onPostExecute(Object)。...为保证任务能被及时地取消,在doInBackground(Object[])中应该经常检查isCancelled()返回 线程规则 Threading rules 一些线程规则 异步任务必须UI线程启动...,mFuture实例化时已经mWorker注入。

    55820

    Android Handler机制13之AsyncTask源码解析

    用法:AsyncTask必须由子类实现后才能使用,它的子类至少重写doInBackground()这个方法,并且通常也会重写onPostExecute()这个方法 下面是一个继承AsyncTask类的一个子类的例子...onPostExecute()方法, 后台任务完成后,在UI线程调用onPostExecute()方法,后台运行的结果作为参数传递给这个方法 取消任务 在任何时候都可以通过调用cancel(boolean...调用此方法后,在执行doInBackground(Object [])方法后,调用onCancelled(object),而不是onPostExecute(Object)方法。...为了尽可能快的取消任务,如果可能的话,你应该在调用doInBackground(Object[])之前检查isCancelled()的返回。...Handler: 优点:代码结构清晰,容易处理多个异步任务 缺点:当有多个异步任务时,由于要配合ThreadRunnable,代码可能会稍显冗余。

    81210

    Android 多线程的几种方式

    ()发消息 传递给onProgressUpdate()作为参数 一般用来更新进度条 第三个String代表任务结束的产出类型,也就是doInBackground()的返回类型,和onPostExecute...2) AsyncTaskdoInBackground(mParams)方法执行异步任务运行在子线程中,其他方法运行在主线程中,可以操作UI组件。...3) 不要手动的去调用AsyncTask的onPreExecute, doInBackground, onProgressUpdate, onPostExecute方法,这些都是由Android系统自动调用的一个任务...而且源码看,如果这个任务已经执行了这个时候调用cancel是不会真正的把task结束,而是继续执行,只不过改变的是执行之后的回调方法是onPostExecute还是onCancelled。...然后你可以在onCreate()onRestoreInstanceState()方法中恢复。 但是,对于AsyncTask怎么办?

    81720

    【Android开发进阶系列】多线程专题

    Handler用法简单明了,可以多个异步任务更新UI的代码放在一起,清晰明了;         2.处理单个异步任务代码略显多;     适用范围         1....多个异步任务的更新UI; 5 AsyncTask 5.1 AsyncTask简介         AsyncTask是一个抽象类,它是由Android封装的一个轻量级异步类(轻量体现在使用方便、代码简洁...其中SerialExecutor线程池用于任务的排队,让需要执行的多个耗时任务,按顺序排列,THREAD_POOL_EXECUTOR线程池才真正地执行任务,InternalHandler用于工作线程切换到主线程...()         如果不需要执行更新进度则为onPreExecute() -->doInBackground() --> onPostExecute(),         除了上面四个方法,AsyncTask...mWorker中的call()方法执行了耗时操作,即result = doInBackground(mParams);,然后把执行得到的结果通过postResult(result);,传递给内部的Handler

    46530

    AsyncTask源码分析

    /** *在主线程中执行 *可传入一个多个参数 */ @MainThread public final AsyncTask。...这个params我们知道它是我们进来的参数,但是sDefaultExecutor是什么呢?它是一个线程池,是一个类的成员变量。...不知道读者有没有发现AsyncTask内部其实是有两个线程池SerialExecutor和THREAD_POOL_EXECUTOR,其中SerialExecutor线程池主要是用于任务添加到队列中,而任务真正的执行是在...当call()方法在执行完doInBackground()方法得到结果后,会将该结果传递给postResult()方法: private Result postResult(Result result)...在AsyncTask中比较重要的成员变量为:WorkerRunnable、FutureTask已经两个线程池,能够真正理解AsyncTask的执行过程一定要搞明白他们几个的调用过程。

    78320

    asynctask使用_androidstudiohelloworld教程

    onPostExecutedoInBackground方法执行完成后会执行该方法,同样运行在UI Thread。...而传入的参数就是doInBackground方法的返回,该类型由上文的Result指定。 繁杂部分和源码浅析 上面基本讲解了AsyncTask的使用方法了。...首先我们知道,取消dialog并不会取消掉AsyncTask,所以再次执行DownloadTask时,相当于此时有两个AsyncTask任务在执行。...所以当执行多个AsyncTask时,他们是串行执行的。 复制代码 上面说了这时一般情况,那么特殊情况呢?...区别在于调用这个方法后,doInBackground执行完成时会调用onCancelled方法,而不是onPostExecute方法,所以cancel无法保证任务能够被取消 内存泄漏 上面的示列代码Activity

    32920

    Android中用AsyncTask简单实现多线程 博客分类: Android 多线程AndroidJ#OSUI

    其实Android已经提供了一个标准的实现多线程的模型,那就是AsyncTask类。      ...这个类用起来很简单,继承他之后,override几个方法,然后就可以在线程执行过程中,不断的结果通知给ui线程。      ...(Integer result) { Log.d("onPostExecute", "result:"+ result); } }       MyThreads继承了AsyncTask...onPostExecute:在doInBackground执行并返回之后调用,因为他需要doInBackground的返回做参数。         怎么使用它呢?...这一句传递了三个参数进去,传递给doInBackground,然后线程开始运行,三个数开始逐一计数,虽然计数不用这么麻烦,但是为了弄明白AsyncTask的运行机制,复杂点反而好。

    41210

    AsyncTask解析

    onPostExecute(Result) 当 doInBackground(Params...)执行完毕,并通过 return进行返回时,这个方法就会马上被调用。...--> onPostExecute() 不需要进度更新:onPreExecute() --> doInBackground() --> onPostExecute() 除了上面的几个核心方法外,AsyncTask...NOTE:AsyncTask中的 cancel()方法并不是真正去取消任务,只是这个任务设置为取消状态,需要在 doInBackgroud(Params…)方法中判断终止任务。...在mWorker的 call()方法中,会调用 doInBackground()执行耗时任务,并将执行结果通过 postResult(result)传递给内部Handler跳转到主线程中。...AsyncTask的串行和并行: 源码可以看出,默认情况下AsyncTask的执行效果是 串行的,因为使用 SerialExecutor类来保证队列的串行。

    58910

    异步处理中使用AsyncTask踩过的坑Android应用界面开发

    任务一旦完成就可以通过 return 语句来任务的执行结果返回,如果 AsyncTask的第三个泛型参数指定的是 Void,就可以不返回任务执行结果。...以及URL-->doInBackground(URL)-->return Long-->onPostExecute(Long),进行结果展示 要启动的时候,使用下方语句即可 new DownloadFilesTask...因为只能一个参数给onProgressUpdate(),使用String[]数组作为中间的参数: AsyncTask 然后通过把其中代表进度的字符串转为int...而MusicService中有个毫秒转变为String型“00:00”格式的方法 竟然成功了!原来,AsyncTask中间这泛型,其实能支持的类型有限吧!(我猜的!)...所以,需要更新多个UI时候,使用AsyncTask还是得多考虑考虑。 --完--

    79210

    Android之AsyncTask类介绍

    AsyncTask的内部封装了两个线程池(SerialExecutor和THREAD_POOL_EXECUTOR)和一个Handler(InternalHandler)。...其中SerialExecutor线程池用于任务的排队,让需要执行的多个耗时任务,按顺序排列,THREAD_POOL_EXECUTOR线程池才真正地执行任务,InternalHandler用于工作线程切换到主线程...AsyncTask有四个重要的回调方法,分别是:onPreExecute、doInBackground, onProgressUpdate 和 onPostExecute。...doInBackground 这个方法中的所有代码都会在子线程中运行,在这里去处理所有的耗时任务。 任务一旦完成就可以通过return语句来任务的执行结果进行返回。...onPostExecutedoInBackground执行完毕并通过return语句进行返回时,这个方法就很快会被调用。

    52520

    【Android 异步操作】AsyncTask 异步任务 ( 参数简介 | 方法简介 | 使用方法 | AsyncTask 源码分析 )

    () 方法传入的参数类型 ; 异步任务执行时 , 进度类型 , onProgressUpdate() 方法传入的参数类型 ; 异步任务结束时 , 结果类型 , onPostExecute() 方法传入参数类型..., onCancelled() 方法参数 ; 二、AsyncTask 方法简介 ---- AsyncTask 常用方法解析 : doInBackground() : 核心方法 , 执行异步任务 ,...的 doInBackground() 方法的输入参数类型 Result 是返回类型 , 也是 AsyncTaskdoInBackground() 方法的执行完毕的返回类型 RunnableFuture...onPostExecute() 方法 五、AsyncTask 构造函数相关源码注释 ---- public abstract class AsyncTask<Params, Progress, Result...() 方法的输入参数类型 * Result 是返回类型 , 也是 AsyncTaskdoInBackground() 方法的执行完毕的返回类型 */ private static

    68700

    AsyncTask源码分析(Android7.0)

    注释1处看这个WorkerRunnable实现了Callable接口,并实现了它的call方法,在call方法中调用了doInBackground(mParams)来处理任务并得到结果,并最终调用postResult...在这里WorkerRunnable作为参数传递给了FutureTask。这两个变量会暂时保存在内存中,稍后会用到它们。 当要执行AsyncTask时,需要调用它的execute方法,代码如下所示。...这里会首先调用 onPreExecute方法,在注释1处AsyncTask的参数传给WorkerRunnable,从前面我们知道WorkerRunnable会作为参数传递给了FutureTask,因此...接下来会调用exec的execute方法,并将mFuture也就是前面讲到的FutureTask进去。...如果AsyncTask任务被取消了则执行onCancelled方法,否则就调用onPostExecute方法。而正是通过onPostExecute方法我们才能够得到异步任务执行后的结果。

    768100
    领券