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



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

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

public class PulseGenerator implements Runnable {...}

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

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

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

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

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

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

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

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

更笼统地提出这个问题,如何从另一个活动访问在一个活动中实例化并在自己的线程中运行的对象?

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

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

有一些可能性:

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

  • 干扰线程包装在单例中,以便您可以从任何活动访问线程。

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

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

    长时间运行的服务生命周期不绑定到活动的生命周期,因此即使活动完成,您的线程也会继续运行,并且可以通过控制它的服务进行访问。请注意两件事:尽管服务不提供 UI,但它在主 UI 线程上运行,并且服务可能由操作系统完成,但之后可以立即重新启动。

最新更新