我有一个类来获取数据以响应主活动中的按钮按下。不幸的是,我一直遇到问题,因为这个类不是Activity或Service。例如,如果没有Context,我就无法将资源ID转换为字符串:
getString(R.string.example_string); // Doesn't work
我是否应该将此类创建为一个服务并让主Activity在关闭时停止该类?我应该将Activity中的Context从这个类传递到这个类吗?
MyClass c = new MyClass(this);
或者有更好的方法来处理这个问题吗?
当我尝试从此课程发送Toast时,也会出现此问题。
更新:Erich和Janusz向我指出了AsyncTask
类的方向,它完美地运行,除了它创建一个新线程并且永远不会杀死该线程。这意味着,只要用户按下按钮,就会添加另一个线程,旧的线程就会坐在那里。
答案 0 :(得分:4)
如果您的后台操作的生命周期与您的活动分离,我会使用Service
。在这种情况下,Service
将拥有自己的Context
,因此您无需将其传入。但是,如果您需要执行后台操作以响应UI事件(和可选择将结果发布回UI线程),我建议你使用AsyncTask
。
答案 1 :(得分:2)
我同意Erich的意见,如果您只有一些小的内容,比如在网络后端发布更改或从手机内存中加载某些内容以在屏幕上显示,请使用Async Task。如果任务将非常“快速”退出(几秒钟),您可以在活动中创建一个匿名类。这将使您能够使用对任务内部外部活动的隐式引用,并且您可以从那里获取上下文。
如果任务运行的时间较长,您可以传递上下文。如果您传递上下文尝试不从活动传递此函数,请使用this.getApplicationContext(),这将最大限度地减少对您的活动的引用数量,并使垃圾收集器能够正确清理。