java活动多次向Looper实现可运行的POST
我已经用Android实现了一个应用程序。有三个组成部分:MainActivity、MyWorker和PublishService。MyWorker从Android的SensorManager获取传感器数据,然后向MainActivity广播。当MainActivity获取消息时,它将调用发布函数,以便将其推送到my PublishService。请参见下图:
下面我展示了我的代码演示:
public class MyActivity extends Activity implements Runnable {
public class PushReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent i){
Result = i.getStringExtra("Result");
Log.d("onReceive_72", Result);
mSend();
}
}
private void mSend(){
Log.d("mSend_80","sent");
handler.post(this);
}
@Override
public void run() {
Log.d("run_87", Result);
handler.postDelayed(this, 500);
Publish(Result); // publish function
}
// more code here <--->
}
我的问题是,当应用程序运行时,Logcat会多次显示"run_87": Result
,但"onReceive_72": Result
和"mSend_80":"sent"
只出现一次。例如:
05-11 11:42:01.286 11631-11631/example I/onReceive_72﹕ Result
05-11 11:42:01.286 11631-11631/example I/mSend_80﹕ sent
05-11 11:42:01.286 11631-11631/example I/run_87﹕ Result
05-11 11:42:01.786 11631-11631/example I/run_87﹕ Result
05-11 11:42:01.946 11631-11631/example I/onReceive_72﹕ Result
05-11 11:42:01.946 11631-11631/example I/mSend_80﹕ sent
05-11 11:42:01.946 11631-11631/example I/run_87﹕ Result
05-11 11:42:02.286 11631-11631/example I/run_87﹕ Result
05-11 11:42:02.446 11631-11631/example I/run_87﹕ Result
05-11 11:42:02.556 11631-11631/example I/onReceive_72﹕ Result
05-11 11:42:02.556 11631-11631/example I/mSend_80﹕ sent
05-11 11:42:02.556 11631-11631/example I/run_87﹕ Result
05-11 11:42:02.786 11631-11631/example I/run_87﹕ Result
05-11 11:42:02.946 11631-11631/example I/run_87﹕ Result
05-11 11:42:03.056 11631-11631/example I/run_87﹕ Result
05-11 11:42:03.221 11631-11631/example I/onReceive_72﹕ Result
05-11 11:42:03.221 11631-11631/example I/mSend_80﹕ sent
05-11 11:42:03.221 11631-11631/example I/run_87﹕ Result
05-11 11:42:03.286 11631-11631/example I/run_87﹕ Result
05-11 11:42:03.461 11631-11631/example I/run_87﹕ Result
05-11 11:42:03.556 11631-11631/example I/run_87﹕ Result
05-11 11:42:03.721 11631-11631/example I/run_87﹕ Result
05-11 11:42:03.786 11631-11631/example I/run_87﹕ Result
05-11 11:42:03.836 11631-11631/example I/onReceive_72﹕ Result
05-11 11:42:03.836 11631-11631/example I/mSend_80﹕ sent
05-11 11:42:03.836 11631-11631/example I/run_87﹕ Result
05-11 11:42:03.961 11631-11631/example I/run_87﹕ Result
05-11 11:42:04.056 11631-11631/example I/run_87﹕ Result
05-11 11:42:04.221 11631-11631/example I/run_87﹕ Result
05-11 11:42:04.286 11631-11631/example I/run_87﹕ Result
05-11 11:42:04.336 11631-11631/example I/run_87﹕ Result
05-11 11:42:04.461 11631-11631/example I/run_87﹕ Result
05-11 11:42:04.486 11631-11631/example I/onReceive_72﹕ Result
05-11 11:42:04.486 11631-11631/example I/mSend_80﹕ sent
05-11 11:42:04.486 11631-11631/example I/run_87﹕ Result
05-11 11:42:04.556 11631-11631/example I/run_87﹕ Result
05-11 11:42:04.721 11631-11631/example I/run_87﹕ Result
05-11 11:42:04.786 11631-11631/example I/run_87﹕ Result
05-11 11:42:04.836 11631-11631/example I/run_87﹕ Result
05-11 11:42:04.961 11631-11631/example I/run_87﹕ Result
05-11 11:42:04.986 11631-11631/example I/run_87﹕ Result
05-11 11:42:05.056 11631-11631/example I/run_87﹕ Result
如您所见,对于每个圆,它从onReceive_72
和mSend_80
开始,然后生成run_87
run_87
似乎比预期的要多得多。下一次,run_87
往往会产生比这一次更多的结果。我不知道为什么会这样?我认为这是由于Runnable导致的,但我不知道如何解决。你能给我一些建议吗?提前谢谢
# 1 楼答案
我自己已经解决了这个问题,但我想在这里向所有可能遇到这个问题的人展示答案。原因是多线程不能有效地管理线程。事实上,我们的系统不能保证多线程同时运行。例如,我放了几行代码
在onReceive中,
receiveResult = true;
和MyActivity的线程具有更高的优先级,因此它被称为比MyWorkerService更多的时间