我在访问控制音频输出的对象时遇到问题,而该对象是在另一个活动中创建的。情况就是这样:
我有一个实现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
引用设置中的行号,我第一次尝试访问'noise'对象。这对我来说非常有意义,因为我已经声明了,但没有初始化'noise'对象。因为我不知道如何,这是这个问题的核心。
更一般地说,如何从另一个活动中访问在一个活动中实例化并在自己的线程中运行的对象?
我是java和Android程序员的开始,这是我的第一篇文章,请回答时不要太简短。实际上我希望这是一个“愚蠢”的初学者关于多活动应用程序编程的问题,并且答案很简单,所以我可以继续我的项目。我感谢任何帮助。
PS: - 在活动之间传递对象的标准方法不适用,因为在其自己的线程中运行的对象不可序列化。 (如果我理解正确的话。) - 我知道每个活动使用多个屏幕的解决方法(其中一个使用setVisibility(View.GONE))并且我可能会开始工作。但是这些解决方案缺乏普遍性,这就是我不想使用它们的原因。
答案 0 :(得分:0)
有一些可能性:
一个简单的解决方案就是在Activity
即将完成时停止线程并在下一个Activity中重新启动它。当然,这取决于线程的作用以及是否可行。
将噪音线程包裹在一个单例中,以便您可以从任何活动中访问该线程。
创建Service
并管理其中的噪音线程。也许您也可以将线程功能重新实现为服务。来自https://developer.android.com/guide/components/services.html:
服务是一个可以在后台执行长时间运行的应用程序组件,它不提供用户界面。
长时间运行的服务生命周期未绑定到Activity的生命周期,因此即使Activity完成,您的线程也会继续运行,并且可以通过控制它的服务进行访问。请注意两件事:虽然服务不提供UI,但它在主UI线程上运行,服务可能由操作系统完成,但可以在之后重新启动。