有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java活动多次向Looper实现可运行的POST

我已经用Android实现了一个应用程序。有三个组成部分:MainActivity、MyWorker和PublishService。MyWorker从Android的SensorManager获取传感器数据,然后向MainActivity广播。当MainActivity获取消息时,它将调用发布函数,以便将其推送到my 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) 个答案

  1. # 1 楼答案

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

    private Boolean receiveResult = false;
    

    在onReceive中,receiveResult = true;

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

    MyActivity的线程具有更高的优先级,因此它被称为比MyWorkerService更多的时间