【发布时间】:2018-05-18 18:55:30
【问题描述】:
我正在编写应用程序,我想从服务中初始化的 BroadCastReceiver 调用 AsyncTask。 我想在后台延迟 AsyncTask 做一些工作,但似乎 Handler 不起作用,因为我在 Logcat 中得到这个输出(简而言之):
05-18 20:33:01.396 19382-19382// D/AsyncTask: Sleeping for a while
Sleeping for a while
.
.
05-18 20:33:01.406 19382-19382// D/AsyncTask: Sleeping for a while
Sleeping for a while
.
.
这是我的代码:
ExampleService.java:
import java.util.*;
import android.content.*;
import com.google.firebase.messaging.*;
import timber.log.*;
public class ExampleService extends FirebaseMessagingService {
private AnotherExample anotherExample;
@Override
public void onMessageReceived(final RemoteMessage message) {
Timber.d("onMessageReceived(): message: %s", message);
anotherExample = new AnotherExample();
if (message.getData() != null) {
processMessage(message.getData());
}
}
private void processMessage(Map<String, String> data) {
Timber.d("processMessage(): data: %s", data);
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Timber.d("onReceiveScreenOff()");
anotherExample.create();
anotherExample.resume();
}
}, filter);
IntentFilter filter1 = new IntentFilter();
filter1.addAction(Intent.ACTION_SCREEN_ON);
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Timber.d("onReceiveScreenOn()");
anotherExample.suspend();
}
}, filter1);
}
}
AnotherExample.java
public class AnotherExample {
AsyncTask asyncTask;
public void create() {
this.asyncTask = new MyAsyncTask();
}
public void resume() {
this.asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public void suspend() {
this.asyncTask.cancel(true);
}
}
MyAsyncTask.java
public class MyAsyncTask extends AsyncTask {
private Handler handler;
private Runnable runnable;
private void setupRunnable() {
runnable = new Runnable() {
@Override
public void run() {
Log.d("AsyncTask", "Sleeping for a while");
}
};
}
@Override
protected Object doInBackground(Object[] objects) {
while (!isCancelled()) {
handler.postDelayed(runnable, 1000);
}
return null;
}
@Override
protected void onCancelled() {
super.onCancelled();
Log.d("AsyncTask", "Removing callbacks");
handler.removeCallbacks(runnable);
}
}
不知道问题出在哪里,我也用Thread.sleep(1000)试了一下,结果还是一样。
有没有其他方法可以实现?
另外我想问一下,AsyncTask 和 BroadCastReceiver 是使用同一个线程吗?因为它看起来像 BroadCastReceiver 在屏幕打开时没有获取信息。
感谢您的每一个建议。
【问题讨论】:
-
我没有遇到您报告的相同问题。请检查我的答案。
标签: java android multithreading android-asynctask