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

如何等待Android中的代码执行?Runnable对我失败了

在Android开发中,如果您想要等待某个代码执行,可以使用AsyncTaskHandler

  1. AsyncTask

AsyncTask是一个轻量级的异步任务框架,可以在后台线程中执行耗时操作,然后在主线程中更新UI。使用AsyncTask的步骤如下:

  • 创建一个继承自AsyncTask的子类
  • 在子类中覆盖doInBackground()方法,在该方法中执行耗时操作
  • 在子类中覆盖onPostExecute()方法,在该方法中更新UI
  • 调用子类的execute()方法启动任务

示例代码:

代码语言:java
复制
private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... params) {
        // 在这里执行耗时操作
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // 在这里更新UI
    }
}

// 启动任务
new MyAsyncTask().execute();
  1. Handler

Handler是Android中的消息传递机制,可以在后台线程中执行耗时操作,然后在主线程中更新UI。使用Handler的步骤如下:

  • 在主线程中创建一个Handler对象
  • 在后台线程中执行耗时操作,并使用Handler对象发送消息
  • 在主线程中的Handler对象中处理消息,并更新UI

示例代码:

代码语言:java
复制
// 在主线程中创建Handler对象
private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        // 在这里处理消息,并更新UI
    }
};

// 在后台线程中执行耗时操作,并发送消息
new Thread(new Runnable() {
    @Override
    public void run() {
        // 在这里执行耗时操作
        // 执行完后发送消息
        handler.sendEmptyMessage(0);
    }
}).start();

总结:

  • AsyncTask适用于较小的、短时的异步任务
  • Handler适用于较大的、长时间的异步任务,可以实现更灵活的控制

这些方法可以帮助您在Android中等待代码执行。

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

相关·内容

面试官:HandlerrunWithScissors()了解吗?为什么谷歌不让开发者用?

如果设置 timeout,则使用 wait(timeout) 进入阻塞,若被超时唤醒,则直接返回 false,表示任务执行失败。...那么现在可以看到 postAndWait() 返回 false 有 2 个场景: Handler post() 失败,表示 Looper 出问题了; 等待超时,任务还没有执行结束; 除了超时唤醒外,我们还需要在任务执行完后...在其中调用 mTask.run(),mTask 即我们需要执行 Runnable 任务。执行结束后,标记 mDone 并通过 notifyAll() 唤醒等待。...,使用安全退出 quitSafely() 方式退出; 四、总结时刻 今天我们介绍一个冷门方法 runWithScissors() 以及其原理,可以通过阻塞方式,向目标线程发送任务,并等待任务执行结束...以上内容均放在开源项目:【github】 已收录,里面包含不同方向自学Android路线、面试题集合/面经、及系列技术文章等,资源持续更新...

98100

Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程 libc.so 动态库 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )

文章目录 前言 一、等待远程进程 mmap 函数执行完毕 二、从寄存器获取进程返回值 三、博客资源 前言 前置博客 : 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 |...远程调用 目标进程 libc.so 动态库 mmap 函数 一 | mmap 函数简介 ) 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程 libc.so...动态库 mmap 函数 二 | 准备参数 | 远程调用 mmap 函数 ) 本博客进行收尾 , 远程调用 mmap 函数后 , 等待函数执行 , 获取该函数执行返回值 ; 一、等待远程进程 mmap...完整代码如下 : /* 等待远程调用执行完毕 */ int stat = 0; waitpid(pid, &stat, WUNTRACED); while (stat !...; 然后读取该寄存器数据 EAX 寄存器值 , 用于获取远程执行 dlopen 函数返回值 , 返回是 libbridge.so 动态库首地址 ; /* 读取寄存器返回值 */ long ptrace_retval

64920
  • Android解析WindowManagerService(一)WMS诞生

    前言 此前用多篇文章介绍WindowManager,这个系列我们来介绍WindowManager管理者WMS,首先我们先来学习WMS是如何产生。...run方法代码很多,这里截取了关键部分,在注释1处加载libandroid_servers.so。...我们往上看,注释1处,执行了传入Runnablerun方法(运行在”android.display”线程),执行完毕后在finally代码块中将mDone设置为true,并调用notifyAll方法唤醒处于等待状态线程...因此得出结论,”system_server”线程线程等待就是”android.display”线程,一直到”android.display”线程执行完毕再执行”system_server”线程,这是因为...方法执行完毕后,处于等待状态android.display”线程才会被唤醒从而继续执行下面的代码

    1.5K60

    面试官带你学Android——面试Handler 这些必备知识点你都知道吗?

    MessageQueue 如何等待消息 上面说到 Looper.loop 其实就是开始读取 MessageQueue 消息,那 MessageQueue 没有消息时候,Looper 在做什么呢...说起来 java wait / notify 也能实现阻塞等待消息功能,在 Android 2.2 及以前,也确实是这样做。...因为 View.post Runnable 执行时候,已经执行过 performTraversals ,也就是 View measure layout draw 方法都执行过了,自然可以获取到...这里再分享一下面试期间复习路线:(以下体系复习资料是从各路大佬收集整理好) 《Android开发七大模块核心知识笔记》 image.png 最后在这里分享一下这段时间从朋友,大佬那里收集到一些...以上内容均放在开源项目:【github】 已收录,里面包含不同方向自学Android路线、面试题集合/面经、及系列技术文章等,资源持续更新...

    69900

    Android AsyncTask完全解析,带你从源码角度彻底理解

    之前也写过了一篇文章从源码层面分析Android异步消息处理机制,感兴趣朋友可以参考 Android Handler、Message完全解析,带你从源码角度彻底理解 。...AsyncTask很早就出现在AndroidAPI里,所以我相信大多数朋友用法都已经非常熟悉。...下面我们就来这个类进行更加详细分析,为了方便阅读,把它代码再贴出来一遍: private static class SerialExecutor implements Executor { final...之后如何又有新任务被执行,同样还会调用offer()方法将传入Runnable添加到队列尾部,但是再去给mActive对象做非空检查时候就会发现mActive对象已经不再是null,于是就不会再调用...Android照片墙应用实现,再多图片也不怕崩溃 这篇文章例子运行结果也证实这个结论。

    81750

    Android线程

    遵循上述两条规则,不能再UI线程之外线程访问UI,但是网络访问结果是在工作线程,要将结果填充到UI怎么办呢,Android提供几种方法在工作线程访问UI Activity.runOnUiThread...当线程执行完毕后,他放弃“互斥锁”,如果一个线程获得“互斥锁”时,其余线程就必须等待当前线程结束并放弃“互斥锁”。 在java,提供关键字synchronized来实现对象“互斥锁”关系。...) 通过调用线程实例start()方法来启动线程使线程进入就绪状态(runnable);处于就绪状态线程已经具备运行条件,但还没被分配到CPU就是不一定会被立即执行,此时处于线程就绪队列,等待线程为期分配...,想给哪个线程发消息就要先拿到哪个线程handler;这里就不贴代码; 学习资料 http://www.jianshu.com/p/02962454adf7 http://www.jianshu.com...,代码都放在GitHub

    1.5K140

    译文 | Android 开发利用异步来优化运行速度和性能

    我们知道,在Android框架中提供很多异步处理工具类。然而,他们中大部分实现是通过提供单一后台线程来处理任务队列。如果我们需要更多后台线程时候该怎么办呢?...在之前一篇文章介绍Android 异步处理8种方法(https://medium.com/android-news/8-ways-to-do-asynchronous-processing-in-android-and-counting-f634dc6fae4e...一方面,操作系统限制同一域下连接数(限制为4)。这意味着,你代码并没有真的按照你意愿执行。新建线程如果超过数量限制则需要等待旧线程执行完毕。 另外,每一个线程都被创建来执行一个任务,然后销毁。...上面这个简单例子代码可以在GitHub(https://github.com/alphamu/ThreadPoolWithCameraPreview)上得到,欢迎看完代码后给我反馈 另外,你也可以在...在程序除了adapternotifyDataSetChanged()方法外,已经将大部分操作从主线程剥离,所以计数器运行是很流畅

    90770

    Android Handler机制13之AsyncTask源码解析

    ,就需要直接Android异步消息处理机制,前面写了很多文章从源码层面分析Android异步消息Handler处理机制。...具体执行时间不确定,该方法用于在后台计算异步任务,把具体进度显示在用户界面。例如,它可以用于进度条进行动画处理或者在文本字段显示日志。...AsyncTaskfinish(Result)方法,所以我们可以这样说,无论AsyncTask是成功还是失败,最后都会执行finish(Result)方法。...,这里就不说明了,通过上面的代码和finish方法分析,我们知道无论成功还是失败,最后一定会调用finish(Result)方法,所以最后状态值为FINISHED。...六、AsyncTask核心流程 其实在上面讲解过程基本上已经把整体流程讲解过了,这里补上一张图,比较全面的阐述AsyncTask执行流程如下: ?

    81210

    Android 异步操作】FutureTask 分析 ( Future 接口解析 | Runnable 接口解析 | Callable 接口解析 )

    文章目录 一、Future 接口 1、Future 接口简介 2、取消任务方法 3、Future 接口源码注释 二、Callable 接口 三、Runnable 接口 上一篇博客 【Android 异步操作...接口设计 : 设计原则 : 该接口被设计为 , 为那些处于活动状态对象 , 并且这些对象想要执行代码 , 提供一个通用协议 ; 如 : Thread 类实现 Runnable 方法 ;...活动状态 : 处于活动状态含义是 , 线程已经被开始 , 还不能被停止 , 如果想要执行代码 , 必须在其它线程执行 ; 创建线程优先策略 : 创建线程 : Runnable 为类提供不需要继承..., 为那些处于活动状态对象 , 并且这些对象想要执行代码 , 提供一个通用协议 ; * 如 : Thread 类实现 Runnable 方法 ; * 处于活动状态含义是 , 线程已经被开始..., 还不能被停止 , 如果想要执行代码 , 必须在其它线程执行 ; * * 另外 , Runnable 为类提供不需要继承 Thread 类 , 之外活动途径 ; * 一个类实现

    2.1K00

    ViewpostDelayed方法深度思考

    文章代码基于 Android5.1 进行分析。 postDelayed源码分析 View.postDelayed 导致将Runnable添加到消息队列,并在经过指定时间后运行。...ThreadLocal 相关知识可以阅读 Android与JavaThreadLocal 。 也就是说这里只能执行主线程 postDelayed Runnable 。...Android4.1.2 设备在 new Thread 使用 View.postDelayed Runnable 是不执行, 但相同代码Android8.0 上是没有任何问题。...需要执行Runnable是先被post到消息队列,然后延迟delay时间之后执行。 ViewpostDelay方法,有没有可能造成内存泄露?...* This method returns immediately. */ void wake(); 在这里阅读代码文档就理解方法有很大帮助,下面的源码分析不懂可以参考上面的文档。

    2.2K10

    About ExecutorService(3),所认识AsyncTask

    提到AT,童鞋们一定首先想到异步,其次,还可能引申出其他名词,比如,串行,并发,并行。很多人认为并发和并行是一码事,下面就说一说,这个四种模式理解。...异步就是彼此相对独立,再等待某件事过程中继续做自己事,不需要等待这一件事完成后再去做,举一个经典不能在经典例子,舍友花花同学大金表坏了,让去修,到了商场,把手表递给修表师傅,修表这个时间段可以逛商场...举个例子,今天休息,花花洗漱完,再去洗漱。 并行:在单CPU多道程序设计系统,进程被交替执行,表现出一种并发外部特种;在多处理器系统,进程不仅可以交替执行,而且可以重叠执行。...在Android包下android\app\ActivityThread.java类,有这样一段代码 // If the app is Honeycomb MR1 or earlier, switch...command); } 看完这段代码,就恍然大悟,差一点就被AT命名给坑,原来SERIAL_EXECUTOR只是一个实现Executor接口内部静态类,内部真正执行任务依然是THREAD_POOL_EXECUTOR

    44830

    ——Handler源码和常见问题解答

    再来看看子线程如何处理,首先在子线程创建一个Handler并发送Runnable。...(引用自Gityuan)线程其实就是一段可执行代码,当可执行代码执行完成后,线程生命周期便该终止,线程退出。而对于主线程,我们是绝不希望会被运行一段时间,自己就退出,那么如何保证能一直存活呢?...,就只执行这个回调,然后就结束,创建该MessageCallBack代码如下: Message msgCallBack = Message.obtain(handler, new Runnable(...Handler.post(Runnable r)方法执行逻辑 我们需要分析平时常用Handler.post(Runnable r)方法是如何执行,是否新创建了一个线程呢,实际上并没有,这个Runnable...对象被包装成一个Message对象,也就是这个Runnable对象就是该MessageCallBack对象,有优先执行权利

    2K20

    SharedPreferences采用什么方式存储数据_sharedpreferences使用方法

    大家好,又见面是你们朋友全栈君。...SharedPreferences(简称sp)Android平台上一个轻量级存储辅助类,它提供key-value键值接口,用来保存应用一些常用配置,在应用通常做一些简单数据持久化缓存。...获取SharedPreferences对象 想要使用sp来存取数据,我们首先要了解如何去获取它,AndroidContext类为我们提供获取SharedPreferences对象抽象接口。...如果文件存在并且可读取,则把字节流读取到内存,并且使用XmlUtils.readMapXml工具方法原始数据进行解析。 数据解析后得到一个Map对象,它保存该sp文件存储所有键值信息。...执行xml数据解析,将内存key-value键值存储到str数据流。 将数据流写入到存储分区。 写入完成后,将备份文件删除。

    1.6K20

    Android Handler机制1之Thread

    纯粹Linux线程与虚拟机线程区别在于虚拟机线程具有运行Java代码runtime。 在Android 当担也就对应一个类。...Runnable { ..... } 通过上面代码,我们可以知道Thread实现Runnable,侧面也说明线程是"可执行代码"。...进入阻塞状态情况: ① 等待某个操作返回,例如IO操作,该操作返回之前,线程不会继续后面的代码等待某个"锁",在其他线程或程序释放这个"锁"之前,线程不会继续执行。...再往下就到内核层,由于篇幅限制,就先不深入,有兴趣同学可以自行研究 三、线程阻塞 线程阻塞指的是暂停一个线程执行等待某个条件发生(如某资源就绪)。...一个线程创建本地变量其他线程不可见,仅自己可见。即使两个线程执行同样代码,这两个线程仍然在自己线程栈代码来创建本地变量。因此,每个线程拥有每个本地变量独有版本。

    79020

    AsyncTask? AsyncTask串行and并行?

    2 AsyncTask知识补充 (如果你AsyncTask已经很熟了,可以跳过该章节) 在讲解AsyncTask坑之前,我们先了解下AsyncTask源码,有助于我们理解为什么他是个坑,我们应该如何处理这个坑...(final Runnable r)传如一个runnable,然后这里mTasks.offer(new Runnable() 又创建一个新runnable入队列。...OK,更详细分析放到了代码。 OK,我们继续回到executeOnExecutor方法。 ?...OK,我们之前只说了我们代码如何放入子线程,但是并没有看见启动子线程代码啊?我们可以看奥,他最终都调用postResult方法。 ?...,最终会在我们执行execute-》executeOnExecutor时,传入执行队列中等待执行

    1K20

    Carson带你学Android:为什么view.post()能保证获取到view宽高?

    Android:异步-多线程 Carson带你学Android:性能优化 Carson带你学Android:动画 背景 业务需求代码开始时机一般是在:Activity生命周期onCreate()...结论 以Handler为基础,View.post() 将传入任务执行时机调整到View 绘制完成之后。下面将从源码角度进行分析。...; 当AttachInfo为null时,则将任务加入当前View等待队列。...此处为了方便理解,我会先讲解过程2 过程2:当AttachInfo为null时,则将任务加入当前View等待队列。...主要原因是: 每个Viewpost() 需执行任务,必须得添加到窗口视图-执行绘制流程 - 任务才会被post到消息队列里去等待执行,即依赖于dispatchAttachedToWindow ()

    39920

    android 线程那点事

    为了保持较高响应速度,这就要求主线程不能执行耗时任务,这个时候子线程就派上用场。子线程也叫工作线程,除了主线程以外线程都是子线程。...在Android系统,在默认情况下,一个应用程序内各个组件(如Activity、BroadcastReceiver、Service)都会在同一个进程(Process)里执行,且由此进程主线程负责执行...如果有特别指定(通过android:process),也可以让特定组件在不同进程运行。无论组件在哪一个进程运行,默认情况下,他们都由此进程主线程负责执行。...为什么会出现ANR Android希望UI线程能根据用户要求做出快速响应,如果UI线程花太多时间处理后台工作,当UI事件发生时,让用户等待时间超过5秒而未处理,Android系统就会给用户显示ANR...Android也有main()方法 刚接触Android开发者可能会因为找不到Java程序执行入口main()方法而觉得疑惑,其实Android当然是也有main()方法(如下),它被包装在源码

    80250

    Android Handler机制8之消息取出与消息其他操作

    ,所以我们将这部分放到最后来将,因为其内部代码逻辑比较复杂,涉及到了障栅如何拦截同步消息、如何阻塞线程、如何在空闲时候执行IdleHandler以及如何关闭Looper等内容,在源码已经做了详细注释...代码如下,因为不复杂,就合并在一起 // Handler.java public final void removeCallbacks(Runnable r) { mQueue.removeMessages...,在Android Handler机制4之Looper与Handler简介文章我们知道Looper停止实际上是关闭消息队列关闭,现在我们来揭示MessageQueue是如何关闭 代码在MessageQueue.java...第5步:删除小时后nativeWake函数,以触发nativePollOnce函数,结束等待,这个块内容请在Android Handler机制9之Native实现,这里就不详细描述 四、查看消息是否存在...就说讲解了。 五、阻塞非安全执行 如果当前执行线程是Handler线程,Runnable会被立刻执行

    1.5K10
    领券