我在我的MainActivity
课程中设置了AlarmManager。
一个名为AlarmReceiver
的类会在每个设定的时间间隔内被激活。
我必须在该类启动时执行操作。该代码位于另一个类Parsing.java
现在在 AlarmReceiver.java 中,我这样做:
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Parsing obj = new Parsing(context);
obj.execute();
}
}
我无法直接在AlarmReceiver.java
中编写代码,因为AlarmReceiver.java
已经在扩展BroadcastReceiver
而我的代码Parsing.java
正在扩展另一个类。
所以,我正在为Parsing
类创建一个对象并调用该方法。
我的方法是否正确?
如果需要,我会提供更多信息。 如果我的方法是正确的,请告诉我? 提前谢谢!
修改
Parsing.java
public class Parsing extends AsyncTask<Void, Void, Void> {
//some code
}
答案 0 :(得分:1)
我不知道您是如何编写Parsing.java的,它看起来不错但请记住这个
除非您明确要求使用registerReceiver在不同的线程上调度此方法,否则始终在其进程的主线程内调用此方法。当它在主线程上运行时,你永远不应该在其中执行长时间运行的操作(在考虑阻塞接收器和被杀死的候选者之前,系统允许超时10秒)。您无法在onReceive()
的实现中启动弹出对话框
对我而言,我认为处理此问题的更好方法是在onReceive方法中调用另一个服务,就像这样
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, ParsingService.class);
context.startService(i);
}
答案 1 :(得分:1)
从AsyncTask
开始BroadcastReceiver
是错误的,原因有两个:
1。方法返回后,onReceive()
运行的线程终止,有效地结束了可能从那里开始的任何长时间运行的任务。引用官方docs:
BroadcastReceiver
对象仅在其持续时间内有效 致电onReceive(Context, Intent)
。一旦你的代码从此返回 功能,系统认为要完成的对象不再 有效.....任何需要异步操作的东西都不是 可用,因为您需要从函数返回来处理 异步操作,但此时BroadcastReceiver
不再是活动的,因此系统可以自由地杀死它的进程 在异步操作完成之前。
2。 Context
提供的onReceive()
实例不同于
Context
或Activity
的{{1}},即Service
或
Activity.this
。您需要适当的Service.this
来执行许多操作
我们通常从Context
或。{
Activity
。因此,例如,正确的方式来启动Service
Service
是:
onReceive()
而不是
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context.getApplicationContext(), ParsingService.class);
context.getApplicationContext().startService(i);
}