首页
学习
活动
专区
工具
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等。

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

相关·内容

AsyncTask? AsyncTask串行and并行?

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

1K20
  • 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注入。

    56620

    Android多线程-AsyncTaskyi(一)

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

    63520

    Android 多线程的几种方式

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

    82220

    Android Handler机制13之AsyncTask源码解析

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

    81310

    【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

    52330

    asynctask使用_androidstudiohelloworld教程

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

    33420

    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的执行过程一定要搞明白他们几个的调用过程。

    78920

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

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

    41510

    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类来保证队列的串行。

    59010

    异步处理中使用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还是得多考虑考虑。 --完--

    80910

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

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

    74300

    Android之AsyncTask类介绍

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

    53720

    AsyncTask和Handler对比

    使用的优点: l  结构清晰,功能定义明确 l  对于多个后台任务时,简单,清晰 使用的缺点: l  在单个后台异步处理时,显得代码过多,结构过于复杂(相对性) AsyncTask介绍 Android的...使用过AsyncTask 的同学都知道一个异步加载数据最少要重写以下这两个方法: doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。...onPostExecute(Result)  相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。...UI thread中调用; 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate...中的第三个参数(也就是接收doInBackground的返回值) * 在doInBackground方法执行结束之后在运行,并且运行在UI线程当中 可以对UI空间进行设置 */

    1.2K50

    Android十八章:ASYNCTASK分析一波

    同时AsyncTask是一个抽象的泛型类 public abstract class AsyncTask{} Params代表参数类型(doInBackground...... params) 在线程池执行的异步任务,在此方法内调用publishProgress 传入int进度值来更新进度,返回结果给onPostExecute,这里的省略号是可以传入多个相同类型的参数。...传入参数为doInBackground的返回值. ps: 当doInBackground的线程被取消就会回调给onCancelled这个方法,此方法被调用onPostExecute就不会调用了。...总结: asynctask对象要在主线程创建,并调用execute方法 不能直接调用doinbackground方法 一个asynctask对象只执行一次 3.0之前asynctask用并行线程池执行,...的构造方法 mWork会调用call方法将mTaskInvoked设置为true,再调用doinbackground 得到返回值再调用onpostexecute方法, 在postResult方法里面会发送

    41230
    领券