gpt4 book ai didi

java - 执行流程

转载 作者:行者123 更新时间:2023-11-30 00:09:45 25 4
gpt4 key购买 nike

假设我的 android studio 项目中有一项 Activity 、MainActivity 和一项服务 MyService。

MainActivity.class

Toast.makeText(this,"Point 1",Toast.LENGTH_SHORT).show();
startService( new Intent(this,MyService.class) ) ;
Toast.makeText(this,"Point 3",Toast.LENGTH_SHORT).show();

我的服务类

Toast.makeText(this,"Point 2",Toast.LENGTH_SHORT).show();

执行流程是Point 1 -> Point 3 -> Point 2 & not 1->2->3

由于服务仅在主 ui 线程中运行,那么后台实际发生了什么?因为所有 3 个点都在同一个线程上执行。

编辑:

我该怎么做才能像 1->2->3 那样执行?

在 MyService 中使用静态变量(并在那里设置一个值)并在 MainActivity 中导入该变量以检查服务是否已成功启动,不起作用(导致 ANR-原因:正在启动 .MyService)。

在主 Activity 中

while(! staticvar.hasBeenSetInMyService){ }

它陷入了无休止的 while 循环。那么是静态变量从未在 MainActivity 中更新还是 MyService 的 onStartCommand() 没有被执行??

最佳答案

有几种方法可以让组件交换信息。在您的情况下,Activity 可以使用 LocalBroadcastManager 注册一个 BroadcastReceiver在启动 Service 之前。

private BroadcastReceiver myReceiver = new BroadcastReceiver(){
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"Received broadcast from Service",Toast.LENGTH_SHORT).show();
MainActivity.this.doPointThree();
}
}

Activity 必须注册和(永远不要忘记!)取消注册 BroadcastReceiver,但我不会在这里详细介绍,而是链接到这个 post on Stack Overflow .让我们假设 BroadcastReceiver 将注册一个

IntentFilter if = new IntentFilter();
if.addAction("your.package.com.POINT_2");

另一方面,服务可以在到达“点 2”后发送本地广播。

Intent intent = new Intent();
intent.setAction("your.package.com.POINT_2");
LocalBroadcastManager.getInstance().sendBroadcast(intent);

这个本地广播将触发 BroadcastReceiveronReceive()

请注意,我说的是本地广播,而不是系统范围内的应用程序间广播。本地广播在系统上很容易,并且对您的应用程序完全私有(private)。

关于java - 执行流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48342407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com