Java AsyncTask未延迟处理程序中的操作
我正在编写应用程序,我想从服务中初始化的BroadCastReceiver调用AsyncTask。 我想AsyncTask在后台延迟执行一些工作,但似乎处理程序不起作用,因为我在Logcat中得到了以下输出:Java AsyncTask未延迟处理程序中的操作,java,android,multithreading,android-asynctask,Java,Android,Multithreading,Android Asynctask,我正在编写应用程序,我想从服务中初始化的BroadCastReceiver调用AsyncTask。 我想AsyncTask在后台延迟执行一些工作,但似乎处理程序不起作用,因为我在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: Sleepin
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);
}
}
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.sleep1000尝试过,但结果是一样的
有没有其他方法来实现它
我还想问,AsyncTask和BroadCastReceiver使用相同的线程吗?因为屏幕打开时,广播接收器似乎无法获取信息
谢谢你的建议。我无法复制你的问题。我的代码似乎工作正常 就叫这个:
private void testAsyncTaskDelay(){
TestEventsData test = new TestEventsData();
test.execute();
}
My TestEventsData类定义:
class TestEventsData extends AsyncTask<String, Integer, Boolean> {
Handler testHandler = new Handler();
@Override
protected Boolean doInBackground(String... params) {
Boolean success = false;
try {
long startTime = SystemClock.elapsedRealtime();
Log.e(TAG, "doInBackground Start " + startTime);
testHandler.postDelayed(new Runnable() {
@Override
public void run() {
long endTime = SystemClock.elapsedRealtime();
long diff = endTime - startTime;
Log.e(TAG, "run Start " + endTime);
Log.e(TAG, "run Start diff " + diff);
}
}, 3000);
}
catch (Exception ex) {
Log.e(TAG, "doInBackground --- " + ex.getMessage());
}
return success;
}
@Override
protected void onCancelled() {
}
@Override
protected void onPostExecute(Boolean success) {
try{
Log.e(TAG, "onPostExecute NOW");
}
catch(Exception ex){
Log.e(TAG, "onPostExecute" + ex.getMessage());
}
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
}
时差3003ms!在我的postDelayed中设置的时间相同。我没有遇到与您报告的问题相同的问题。请检查我的答案。谢谢,我已经试过了,经过3个小时的调试后,我注意到我正在从两个不同的地方注册BroadcastReceiver,所以我没有取消一个线程。谢谢你的帮助。
class TestEventsData extends AsyncTask<String, Integer, Boolean> {
Handler testHandler = new Handler();
@Override
protected Boolean doInBackground(String... params) {
Boolean success = false;
try {
long startTime = SystemClock.elapsedRealtime();
Log.e(TAG, "doInBackground Start " + startTime);
testHandler.postDelayed(new Runnable() {
@Override
public void run() {
long endTime = SystemClock.elapsedRealtime();
long diff = endTime - startTime;
Log.e(TAG, "run Start " + endTime);
Log.e(TAG, "run Start diff " + diff);
}
}, 3000);
}
catch (Exception ex) {
Log.e(TAG, "doInBackground --- " + ex.getMessage());
}
return success;
}
@Override
protected void onCancelled() {
}
@Override
protected void onPostExecute(Boolean success) {
try{
Log.e(TAG, "onPostExecute NOW");
}
catch(Exception ex){
Log.e(TAG, "onPostExecute" + ex.getMessage());
}
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
}
05-18 15:15:51.951 24329-24345/? E/MainActivity: doInBackground Start 1471880721
05-18 15:15:52.003 24329-24329/? E/MainActivity: onPostExecute NOW
05-18 15:15:54.953 24329-24329/com.asb.android.mcc E/MainActivity: run Start 1471883724
05-18 15:15:54.953 24329-24329/com.asb.android.mcc E/MainActivity: run Start diff 3003