我在Android中实现了一个应用程序。有三个组件:MainActivity,MyWorker和PublishService。 MyWorker从Android的SensorManager获取传感器数据,然后广播到MainActivity。当MainActivity获取消息时,它将调用发布函数以将其推送到我的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引起的,但我不知道如何解决。能不能给我适当的建议,谢谢你。
答案 0 :(得分:1)
我自己已经解决了,但我想在这里为每个可能遇到这个问题的人展示答案。原因是多线程不是有效管理线程。事实是我们的系统不能保证多线程同时运行。例如,我添加了一些代码行
private Boolean receiveResult = false;
in onReceive,receiveResult = true;
和
if (receiveResult) {
receiveResult = false;
Log.i("run_87", "Result");
Publish(Resulty);
}
MyActivity的线程具有更高的优先级,因此比MyWorkerService调用的时间更长。