多次将Runnable帖子实施到Looper的活动

时间:2015-05-11 04:55:00

标签: java android

我在Android中实现了一个应用程序。有三个组件:MainActivity,MyWorker和PublishService。 MyWorker从Android的SensorManager获取传感器数据,然后广播到MainActivity。当MainActivity获取消息时,它将调用发布函数以将其推送到我的PublishService。请看下图: enter image description here

下面我展示了我的代码:

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_72mSend_80开头,然后生成run_87run_87似乎比预期的要多得多。而下一次,run_87往往产生的时间超过这个时间。我不知道为什么会这么开心?我认为这是由Runnable引起的,但我不知道如何解决。能不能给我适当的建议,谢谢你。

1 个答案:

答案 0 :(得分:1)

我自己已经解决了,但我想在这里为每个可能遇到这个问题的人展示答案。原因是多线程不是有效管理线程。事实是我们的系统不能保证多线程同时运行。例如,我添加了一些代码行

private Boolean receiveResult = false;

in onReceive,receiveResult = true;

if (receiveResult) {
     receiveResult = false;
     Log.i("run_87", "Result");
     Publish(Resulty);
}

MyActivity的线程具有更高的优先级,因此比MyWorkerService调用的时间更长。