首页
学习
活动
专区
工具
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中等待代码执行。

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

相关·内容

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

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

99200

【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

65920
  • 5个Android 多线程和并发方面的深度面试题

    面试题目3:解释什么是线程池,以及在Android中如何使用线程池。 解答: 线程池是一种执行器(Executor),用于在一个后台线程中执行任务。...同步代码块:使用synchronized关键字包裹的代码块,只对特定的代码段进行同步。 在Android中,通常使用同步方法来保护对共享资源的访问,例如,当多个线程需要访问同一个数据结构时。...同步代码块提供了更细粒度的控制,可以在需要同步的代码段使用,以减少同步带来的性能开销。 面试题目5:解释什么是死锁,以及如何在Android中避免死锁。...解答: 死锁是指两个或多个线程在执行过程中,因争夺资源而造成的一种僵局。当线程A等待线程B持有的资源,而线程B又在等待线程A持有的资源时,就发生了死锁。...为了避免死锁,可以采取以下措施: 避免锁的嵌套:尽量减少锁的使用,或者避免多个锁的嵌套。 使用定时锁:使用tryLock尝试获取锁,如果失败则等待一段时间后重试。

    15110

    Android解析WindowManagerService(一)WMS的诞生

    前言 此前我用多篇文章介绍了WindowManager,这个系列我们来介绍WindowManager的管理者WMS,首先我们先来学习WMS是如何产生的。...run方法代码很多,这里截取了关键的部分,在注释1处加载了libandroid_servers.so。...我们往上看,注释1处,执行了传入的Runnable的run方法(运行在”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路线、面试题集合/面经、及系列技术文章等,资源持续更新中...

    70400

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

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

    83450

    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)上得到,欢迎看完代码后给我反馈 另外,你也可以在...在程序中除了adapter中的notifyDataSetChanged()方法外,我已经将大部分的操作从主线程中剥离,所以计数器的运行是很流畅的。

    91270

    Android Handler机制13之AsyncTask源码解析

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

    81310

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

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

    2.1K00

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

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

    2K20

    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

    45030

    View的postDelayed方法深度思考

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

    2.2K10

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

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

    1.7K20

    Android Handler机制1之Thread

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

    80520

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

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

    41520

    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

    android 线程那点事

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

    81450
    领券