如何从另一个活动访问在一个活动中实例化并在其自己的线程中运行的对象?

Posted

技术标签:

【中文标题】如何从另一个活动访问在一个活动中实例化并在其自己的线程中运行的对象?【英文标题】:How to access an object instantiated in one activity and running in its own thread, from another activity? 【发布时间】:2017-08-13 07:05:13 【问题描述】:

我在访问控制音频输出且在另一个活动中创建的对象时遇到问题。情况是这样的:

我有一个实现 Runnable 的类,以便我可以在自己的线程中运行它:

public class PulseGenerator implements Runnable ...

在我的主要活动中,我实例化了这个类,将实例传递给 Thread 对象并启动线程:

noise = new PulseGenerator();
noiseThread = new Thread(noise);
noiseThread.start();

我的主活动屏幕中有一些控件来控制“噪音”的内部结构:打开和关闭音频、选择波形、更改脉冲宽度等。这一切都很好。

现在我想将其中一些现有的和工作的控件移动到另一个我称为“设置”的屏幕上。 (为了在主 Activity 屏幕上为其他附加控件腾出空间。)我遵循了典型的 android 方法,为新的 Settings 屏幕创建了一个新 Activity:

public class Settings extends Activity implements OnItemSelectedListener, View.OnClickListener  ... 

这听起来很简单。我现在遇到的问题是我不知道如何从新的设置屏幕/活动/类中访问“噪音”对象。当我在模拟器上运行应用程序并按下按钮切换到设置活动时,应用程序崩溃(“不幸的是,xxxxx 已停止。”)并在 Android Studio 的“运行”视图中,我得到:

E/AndroidRuntime: FATAL EXCEPTION: main java.lang.NullPointerException

在我第一次尝试访问“噪音”对象的“设置”中引用行号。这对我来说非常有意义,因为我已经声明但没有初始化“噪声”对象。因为我不知道怎么做,这是这个问题的核心。

更一般地说,我

我是初学java和Android程序员,这是我的第一篇文章,回答时请不要太简短。实际上,我希望这是一个关于多活动应用程序编程的“愚蠢”初学者问题,答案很简单,这样我就可以继续我的项目了。感谢您的帮助。

PS: - 在活动之间传递对象的标准方法不适用,因为在其自己的线程中运行的对象是不可序列化的。 (如果我理解正确的话。) - 我知道每个活动使用多个屏幕的解决方法(其中一个使用 setVisibility(View.GONE))并且我可能可以开始工作。但这些解决方案缺乏通用性,这就是我不想使用它们的原因。

【问题讨论】:

据我所知,没有办法做到这一点。您可以尝试的是:a)使用“共享首选项”保存设置活动中的内容 b)一旦更改任何设置,请在您的其他活动中使用“广播接收器”来更新噪声变量 将可变噪声声明为静态。 @LineFollower,你为什么不将它声明为单例。您可以从任何地方获取它。 【参考方案1】:

有一些可能性:

一个简单的解决方案是在Activity 即将完成时停止线程并在下一个活动中重新启动它。当然,这取决于线程是做什么的,以及它是否可能。

将噪声线程封装在一个单例中,这样您就可以从任何 Activity 访问该线程。

创建一个Service 并管理其中的噪音线程。也许您还可以将线程功能重新实现为服务。来自https://developer.android.com/guide/components/services.html

Service是一个应用程序组件,可以在后台执行长时间运行的操作,它不提供用户界面。

长时间运行的 Service 生命周期不受 Activity 生命周期的约束,因此即使 Activity 完成,您的线程仍会继续运行,并且可以通过控制它的 Service 访问。注意两点:虽然Service不提供UI,但它运行在主UI线程上,并且Service可能会被操作系统完成,但之后可以立即重新启动。

【讨论】:

以上是关于如何从另一个活动访问在一个活动中实例化并在其自己的线程中运行的对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个类引用当前或主要活动

如何从另一个活动中编辑和获取 editText 输入字段的更新?

如何从另一个片段访问片段对象

如何从另一个活动中调用片段

从另一个提供循环依赖的模块打开活动

Android - 使活动全屏并在其顶部显示状态栏