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

Java 如何从另一个活动访问在一个活动中实例化并在其自身线程中运行的对象?,java,android,multithreading,android-activity,runnable,Java,Android,Multithreading,Android Activity,Runnable,我在访问控制音频输出的对象时遇到问题,该对象是在另一个活动中创建的。情况是这样的: 我有一个实现Runnable的类,这样我就可以在自己的线程中运行它: public class PulseGenerator implements Runnable {...} 在我的主要活动中,我实例化了这个类,将实例传递给Thread对象并启动线程: noise = new PulseGenerator(); noiseThread = new Thread(noise); noiseThread.star

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

我有一个实现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 { ... }
这听起来很简单。我现在的问题是,我不知道如何从新设置屏幕/活动/类访问“噪波”对象。当我在emulator上运行应用程序并按下按钮切换到“设置”活动时,应用程序崩溃(“不幸的是,xxxxx已停止”)。在Android Studio的“运行”视图中,我得到:

E/AndroidRuntime:致命异常:main java.lang.NullPointerException

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

更一般地说,如何从另一个活动访问在一个活动中实例化并在其自身线程中运行的对象

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

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

有一些可能性:

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

  • 将noise线程包装在一个单例中,以便可以从任何活动访问该线程

  • 创建一个
    服务
    并在其中管理噪波线程。也许您还可以将线程功能作为服务重新实现。发件人:

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

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


    • 有一些可能性:

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

      • 将noise线程包装在一个单例中,以便可以从任何活动访问该线程

      • 创建一个
        服务
        并在其中管理噪波线程。也许您还可以将线程功能作为服务重新实现。发件人:

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

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


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