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

在android中,线程完成其作业或返回值后,在MainActivity中运行一行

在Android中,线程完成其作业或返回值后,在MainActivity中运行一行代码可以通过以下方式实现:

  1. 使用Handler: 在线程中,使用Handler将消息发送到主线程的消息队列中,然后在主线程中处理该消息。具体步骤如下:
  • 在MainActivity中创建一个Handler对象,并重写其handleMessage()方法,用于处理消息。
  • 在线程中创建一个Handler对象,并使用post()方法将消息发送到主线程的消息队列中。
  • 在MainActivity中的handleMessage()方法中执行需要在主线程中运行的代码。

示例代码: 在MainActivity中:

代码语言:txt
复制
private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        // 在主线程中执行需要运行的代码
        // ...
    }
};

// 在线程中发送消息
new Thread(new Runnable() {
    @Override
    public void run() {
        // 线程完成作业或返回值后,发送消息到主线程
        handler.sendEmptyMessage(0);
    }
}).start();
  1. 使用runOnUiThread()方法: 在线程中,可以使用Activity的runOnUiThread()方法来在主线程中执行代码。具体步骤如下:
  • 在线程中调用Activity的runOnUiThread()方法,并传入一个Runnable对象,在Runnable对象的run()方法中执行需要在主线程中运行的代码。

示例代码:

代码语言:txt
复制
new Thread(new Runnable() {
    @Override
    public void run() {
        // 线程完成作业或返回值后,在主线程中执行代码
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // 在主线程中执行需要运行的代码
                // ...
            }
        });
    }
}).start();

这两种方式都可以在线程完成作业或返回值后,在MainActivity中运行一行代码。

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

相关·内容

【Kotlin 协程】协程底层实现 ③ ( 结构化并发 | MainScope 作用域 | 取消协程作用域 | Activity 实现 CoroutineScope 协程作用域接口 )

lifecycleScope : 该作用与仅在 Activity 中使用 , 与 Activity 生命周期绑定 ; 一、MainScope 协程作用域 ---- MainScope 是一个 函数 , 返回值类型为...", "withContext : 协程执行耗时操作") } // 挂起函数, 可以不使用协程调度器 delay(20000) // 主线程更新 UI Log.i("MainActivity...* 原因可以用来指定错误消息提供其他细节为调试目的而取消的原因。 * 如果作用域中没有作业,抛出[IllegalStateException]。...import android.os.Bundle import android.util.Log import kotlinx.coroutines.* class MainActivity : AppCompatActivity...import android.util.Log import kotlinx.coroutines.* class MainActivity : AppCompatActivity(), CoroutineScope

1.1K10

Android实现音乐播放进度条传递信息的两种方式(service和activity)

实现播放时的进度条显示,或是定时从service获取某些信息,是我们日常开发中经常遇到的需求,下面介绍当音乐再service运行时,activity如果获取音乐进度信息的两种方式: 一、activity...建立消息接收机制 我们需要在activity建立一个用于接收信息的handler(handler简单的说是android可以发送消息和也可以处理消息的一种机制,当然它的用途更加强大,有时间可以去自己了解...下面是代码,有的同学可能看出来了,这个Handler的handleMessage被重写了,handleMessage写在了new Handler.Callback()回调函数返回值变成了boolean...的handler发送信息 MainActivity.handler.sendMessage(msg); } }, 0, 50); 当然你也可以使用线程的方式来发现音乐进度信息...Android作业 音乐播放器 总结 到此这篇关于Android实现音乐播放进度条传递信息的两种方式(service和activity)的文章就介绍到这了,更多相关android 实现音乐播放进度条内容请搜索

2.2K30

【Kotlin 协程】协程启动 ② ( 多协程控制 | launch 协程执行顺序控制 | Job#join() 函数 | async 协程执行顺序控制 | Deferred#await() 函数 )

; /** * 挂起协程,直到此作业完成。...* * 注意,只有当所有子任务都完成时,作业才算完成。 * * 这个挂起函数是可取消的,并且**总是**检查是否取消了调用协程的Job。...* 如果调用协程的[Job]被取消完成 * 函数被调用,当它被挂起时,此函数 * 把[CancellationException]。...; /** * 不阻塞线程的情况下等待该值的完成,并在延迟的计算完成时恢复, * 返回结果值,如果取消了延迟,则抛出相应的异常。...如果在此函数被取消时作业被取消 * 挂起,它将无法成功恢复。有关底层细节,请参阅[suspendCancellableCoroutine]文档。

83620

【Kotlin 协程】协程取消 ② ( CPU 密集型协程任务取消 | 使用 isActive 判定协程状态 | 使用 ensureActive 函数取消协程 | 使用 yield 函数取消协程 )

协程 , 定义 kotlinx.coroutines 包下的 suspend 挂起函数 是可以取消的 ; 但是有一种协程任务 , CPU 密集型协程任务 , 是无法 直接取消的 ; 此类任务一直...Completing | 已完成 Completed | 取消 | 已取消 ) 代码示例 : 在下面的代码 , 执行 CPU 密集型任务 , 循环 10000000 次进行运算 , 然后每次循环时...(线程池) * 到同一调度程序上运行的其他协程。...* 如果在调用此挂起函数时取消完成当前协程的[Job] * 这个函数正在等待调度,它会以[CancellationException]恢复。 * 有**立即取消的保证**。...如果在此函数被取消时作业被取消 * 挂起,它将无法成功恢复。有关底层细节,请参阅[suspendCancellableCoroutine]文档。

1K20

Android 开发你需要了解的那些事:学习路线规划+技术需注意的问题

假设这里回答的不是“线程执行耗时任务”的话,可以不继续追问,直接让小伙伴去了解 ANR,后期再讨论。 如果回答了是“线程执行耗时任务”的话,那么继续: Q: 多久算耗时?... sleep 前和 sleep 都会打印日志。 如果你只是点击按钮,然后什么都不动,是不会有 ANR 的。 但是你点击了按钮之后,你继续多次点击按钮,那么就会有 ANR 了。...以下四个条件都可以造成ANR发生: InputDispatching Timeout: 5秒内无法响应屏幕触摸事件键盘输入事件 BroadcastQueue Timeout : 执行前台广播(BroadcastReceiver...如果你不关心返回值并且你是应用的主线程使用的话,考虑使用 apply 替换 commit。 由于我们一般不会处理返回值,因此建议使用 apply 替换 commit。...大概意思就是 apply 如果在处理还未完成的情况下,commit 会阻塞直到所有异步操作完成才会去 commit。 因此如果要替换,建议将 commit 都替换为 apply。

76620

Android事件处理机制

注意:事件源可以是任何的界面组件,不太需要开发者参与,注册监听器叶只要一行代码就实现了,因此事件编程的重点是实现事件监听器类 android设备可用物理编码按键及案件编码 ?...点击按钮: ? 2.3外部类形式作为事件监听器类 布局界面如下 ? MainActivity.java主要代码如下 ?...很明显,两个参数的那个构造函数是负责自定义组件的构造的 bug改好,我们再运行一遍 ? 随便输入一个东西,我们看看打印了什么内容 ?...类主要有两个作用:新启动的线程中发送消息,线程获取和处理消息 只能通过回调的方法来实现-开发者只需要重写Handler类处理的消息的方法即可,当新启动的线程发送消息时,消息会发送到与之关联的...上面代码的Timer类会启动一个新线程,由于不允许在线程修改UI界面,所以该线程每隔1200毫秒会发送一个消息,该消息会传递到Activity,再由Handler类进行处理,从而实现了动态切换的效果

82630

Android 异步操作】AsyncTask 异步任务 ( FutureTask 模拟 AsyncTask 执行过程 | AsyncTask 执行过程回顾 | FutureTask 分析 )

String 类型 ; ② 创建 FutureTask 对象 : new FutureTask(new MyCallable()) , 返回值是 String 类型 , 传入 MyCallable...执行完毕自动回调方法 : FutureTask 的 done() 方法 , 是 MyCallable 的 call() 方法执行完毕 , 自动回调的方法 ; 3 ...., AsyncTask 异步任务就是使用了该机制 ; 需要开发者传入 Callable 或者 Runnable 实现类对象 , 该对象定义要在子线程执行的操作...获取计算结果 计算结果只能在计算完毕之后获取 ; 如果计算没有完成 , 计算方法将会阻塞 ; 计算过程是一次性的 , 计算已经完成 , 无法重新开始取消 , 除非调用重置方法 该类实现了 RunnableFuture...获取计算记过 * 计算结果只能在计算完毕之后获取 ; * 如果计算没有完成 , 计算方法将会阻塞 ; * 计算过程是一次性的 , 计算已经完成 , 无法重新开始取消 , 除非调用重置方法

33500

Android NDK 开发】JNI 线程 ( JNI 线程创建 | 线程执行函数 | 非 JNI 方法获取 JNIEnv 与 Java 对象 | 线程获取 JNIEnv | 全局变量设置 )

是一个函数指针 , 参数和返回值类型是 void* 类型 ; 参数 4 ( void *arg ) : 参数 3 线程运行函数的参数 ; 3....) ) : 线程运行函数指针 , start_rtn 是一个函数指针 , 参数和返回值类型是 void* 类型 参数 4 ( void *arg ) : 参数 3 线程运行函数的参数...线程方法获取 JNIEnv ---- 线程获取 JNIEnv * env 步骤 : ① JNIEnv 无法跨线程 : JNI 方法参数的 JNIEnv 指针是不能跨线程使用的 , 线程调用...线程调用 JNI 方法 , JNIEnv 指针不能在子线程中使用 如果在子线程中使用 JNIEnv 指针 , 需要使用 JavaVM 获取 指定线程的 JNIEnv 指针..., 线程调用 JNI 方法 , JNIEnv 指针不能在子线程中使用 如果在子线程中使用 JNIEnv 指针 , 需要使用 JavaVM 获取 指定线程的 JNIEnv 指针

73720

Android卡顿分析

,931] 三、AndroidStudio Profile使用 1、 Android 12 及更高版本上检测卡顿情况 对于搭载 Android 12(API 级别 31)更高版本的设备,CPU 性能分析器...每个卡顿帧,红色部分突出显示了相应帧超出渲染截止时间的时长。 image.png 发现卡顿帧,点击该帧;可根据需要按 M 键调整缩放程度以聚焦到所选帧。...image.png 找到运行时间最长的帧,然后选择表一行。这将在左侧的时间轴视图中放大所选的帧。...通常情况下,发生这种情况是因为界面线程处于忙碌状态。动画播放期间,它会导致屏幕上出现可见的闪烁,并且动画滚动完成之前,会持续带来额外的输入延迟。...这些线程与界面呈现有关,可能是导致卡顿的原因。 如需 Android 10 更低版本上检测卡顿情况,请执行以下操作: 查看 Display 的 Frames 轨迹。

2.4K20

Android Service完全解析,关于服务你所需知道的一切(上)

MainActivity的onCreate()方法里加入一行打印当前线程id的语句: Log.d("MyService", "MainActivity thread id is " + Thread.currentThread...().getId()); 然后MyService的onCreate()方法里也加入一行打印当前线程id的语句: Log.d("MyService", "MyService thread id is "...当然会,但是我们可以Service再创建一个子线程,然后在这里去处理耗时逻辑就没问题了。 额,既然Service里也要创建一个子线程,那为什么不直接在Activity里创建呢?...而且一个Activity创建的子线程,另一个Activity无法对进行操作。...现在重新运行一下程序,并点击Start ServiceBind Service按钮,MyService就会以前台Service的模式启动了,并且系统状态栏会弹出一个通栏图标,下拉状态栏可以看到通知的详细内容

1.4K50

Android | 网络技术基础梳理——WebView以及HTTP运用、XML以及JSON解析(demo+bug)

至此,即可运行程序了,效果如下: ? 当然还要注意一点,如果你的模拟器和SDK是Android 9.0(API级别28),那运行如上代码会出现下面这个问题: ?...传给showResponse() showResponse()通过runOnUiThread()将返回的数据显示到界面上; 关于runOnUiThread()方法, 因为Android不允许线程中进行...只有稳定PC端接线网络热点才可顺利使用!!...()完成整个XML解析时调用; startElement()、characters()、endElement()三个方法是有参数的, 从XML解析的数据会以参数的形式传入到这些方法获取节点中的内容时...,子线程中进行具体的网络操作; 子线程是无法通过return语句来返回数据的, 因此这里将服务器响应的数据 传入了HttpCallbackListener的onFinish()方法调用者

2.8K20

Android Service完全解析,关于服务你所需知道的一切(上)

MainActivity的onCreate()方法里加入一行打印当前线程id的语句: Log.d("MyService", "MainActivity thread id is " + Thread.currentThread...().getId()); 然后MyService的onCreate()方法里也加入一行打印当前线程id的语句: Log.d("MyService", "MyService thread id is...当然会,但是我们可以Service再创建一个子线程,然后在这里去处理耗时逻辑就没问题了。 额,既然Service里也要创建一个子线程,那为什么不直接在Activity里创建呢?...而且一个Activity创建的子线程,另一个Activity无法对进行操作。...现在重新运行一下程序,并点击Start ServiceBind Service按钮,MyService就会以前台Service的模式启动了,并且系统状态栏会弹出一个通栏图标,下拉状态栏可以看到通知的详细内容

79440

Android开发之漫漫长途 Ⅰ——Android系统的创世之初以及Activity的生命周期

下面我们来看一下整个Android应用程序的生母吧。 ① Android下的进程(看清楚不是线程哦) 我们开发Android应用程序的时候经常使用到**线程**,那么有没有想过**进程**呢。...完成加载系统,演变为进程调度、交换 >**init进程由idle通过kernel_thread创建,在内核空间完成初始化, 加载init程序, 并最终用户空间** >由0进程创建,完成系统的初始化...是系统中所有其它用户进程的祖先进程 >Linux的所有进程都是有init进程创建并运行的。首先Linux内核启动,然后在用户空间中启动init进程,再启动>其他系统进程。...系统启动完成完成,init将变为守护进程监视系统其他进程。 由上可知**init**进程是Linux系统中所有其他用户进程的祖先进程。其实它也是Android系统的第一个进程。...(简称AMS)是Android中最核心的服务,主要负责系统四大组件的启动、 切换、 调度及应用进程的管理和调度等工作,职责与操作系统的进程管理和调度模块类似。

33920

笔记:Activity的启动过程

启动MainActivity的前后,可以运行命令来查看有关的Activities的信息。...它们分别运行在不同的进程,整个过程它们之间使用Binder完成跨进程通信。 NOTE:源代码为android系统2.3。 下面是完整的过程,非重要部分会很简单地描述下,保证流程完整性。...因为对Binder方法onTransact()的执行基本是(当跨进程时)Binder线程池中的线程执行的,可见这里定义mH就是为了供其它非主线程的操作转到主线程执行。...如果延迟时间新启动的App进程未通知AMS它启动完成,否则AMS不再继续处理MainActivity的启动。 阶段5 接下来就是android应用程序进程启动的过程。...这样AMS就继续执行启动MainActivity的操作。 AMS检查用来运行MainActivity的进程不存在,创建并启动一个App进程。 新进程启动完成,向AMS发送启动完成的进程间通信请求。

1.3K80

Android开发之漫漫长途 Ⅰ——Android系统的创世之初以及Activity的生命周期

下面我们来看一下整个Android应用程序的生母吧。 ① Android下的进程(看清楚不是线程哦) 我们开发Android应用程序的时候经常使用到线程,那么有没有想过进程呢。...完成加载系统,演变为进程调度、交换 >**init进程由idle通过kernel_thread创建,在内核空间完成初始化, 加载init程序, 并最终用户空间** >由0进程创建,完成系统的初始化...是系统中所有其它用户进程的祖先进程 >Linux的所有进程都是有init进程创建并运行的。首先Linux内核启动,然后在用户空间中启动init进程,再启动>其他系统进程。...系统启动完成完成,init将变为守护进程监视系统其他进程。 由上可知**init**进程是Linux系统中所有其他用户进程的祖先进程。其实它也是Android系统的第一个进程。...)是Android中最核心的服务,主要负责系统四大组件的启动、 切换、 调度及应用进程的管理和调度等工作,职责与操作系统的进程管理和调度模块类似。

28820

Android开发高级进阶——多线程(实现简单下载器)

每个Android应用在被启动时都会创建一个线程,这个线程称为主线程UI线程Android应用的所有操作都会运行在这个线程。...---- Android3.0以及以后的版本,禁止线程执行网络请求,否则会抛出异常,可见UI线程执行耗时操作是不推荐的行为。所以,进行与耗时操作同步进行的操作时(即并行)使用多线程。...onProgressUpdate(Progress... values):doInBackground()方法调用publishProgress()方法更新任务的执行进度,将会触发该方法。...onPostExecute(Result result):当doInBackground()完成,系统会自动调用onPostExecute()方法,并将doInBackground()方法的返回值传给该方法...方法执行更新进度,onPostExecute()方法销毁进度条对话框,并弹出Toast提示下载完成

86320

【Jetpack】Room + ViewModel + LiveData 综合使用 ( 核心要点说明 | 组合方式 | 代码示例 )

, 每当数据库的数据发生变化时 , 就需要开启线程 , 重新获取数据库的数据 ; 为了优化上述问题 , 可以引入 LiveData 和 ViewModel , ViewModel 是 视图 View...结合使用要点 对于 Room 框架使用来说 , Room 与 LiveData 结合使用 , Room 单独使用 , 唯一的区别是 Room 框架的 Dao 数据访问接口对象 的 查询方法 , 返回值类型改为...: LiveData> 原来的方法如下 , 查询接口的返回值是 List ; /** * 查询数据库表 */ @Query..., Room 框架的 Dao 数据库访问接口中 定义了 LiveData 返回值类型的查询方法 ; /** * 查询数据库表 */ @Query("select...Room 框架的 Dao 数据库访问对象接口 的定义方式需要作出改变 , 涉及到数据库查询的 接口方法时 , 返回值需要 返回 LiveData 类型 , 泛型设置为 List 类型

62220
领券