为什么在这种情况下处理程序只收到一条消息



在一个活动中,我有以下代码:

   public void onStartMonitoringToggleClicked(View v) {
    // Perform action on clicks
    if (((ToggleButton) v).isChecked()) {
        monitoringCanRun = true;
        new Thread(new Runnable() {
        public void run() {
            performMonitoring(); //start the monitor
        }
        }).start();
    } else {
        monitoringCanRun = false;
    }
    }
    public void performMonitoring() {
    while (monitoringCanRun) {
        float parametervalue = Monitor.getParameterValue();
        //need to send the parameter value to the parameter screen's handler now
        Message msg = mHandler
            .obtainMessage(MESSAGE_UPDATE_PARAMETER_VALUE);
        Bundle bundle = new Bundle();
        bundle.putFloat(PARAMETER_VALUE, parametervalue);
        msg.setData(bundle);
        mHandler.sendMessage(msg);
        Log.i("x", "sending MSG------>"); //this gets called EVERY 4 seconds
        try { //we delay to make debugging easier
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        }
    }

    public final int MESSAGE_UPDATE_PARAMETER_VALUE = 1;
    public final String PARAMETER_VALUE = "paramVal";
    //the handler that receives the parameter values from the monitoring thread
    public final Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        Log.i("x", "<-------RECEIVED MSG");  //this gets called only ONCE???????
        switch (msg.what) {
        case MESSAGE_UPDATE_PARAMETER_VALUE: {
        float parameter_value = msg.getData().getFloat(PARAMETER_VALUE);
        if (DEBUG)
            Log.i(this.getClass().getSimpleName(),
                "-> "
                    + Thread.currentThread().getStackTrace()[2]
                        .getMethodName()
                    + " parameterValue="
                    + String.format("%4.2", parameter_value));
        }
        break;
        }
    }
    };

我使用过很多处理程序,但从未遇到过这种问题。这里有什么基本问题吗?

非常感谢

您尝试过不使用线程吗?你能试着使用一个处理程序,它每4秒调用一次自己吗?我修改了一个项目,在该项目中我使用Handler进行回调。是的,我会在UI线程上,但看起来你没有做任何阻塞IO。我可能错了。

public void onStartMonitoringToggleClicked(View v) {
  // Perform action on clicks
  if (((ToggleButton) v).isChecked()) {
    monitoringCanRun = true;
    mHandler.postDelayed(mUpdateTimeTask, 4000);
  } else {
    monitoringCanRun = false;
    mHandler.removeCallbacks(mUpdateTimeTask);
  }
}
private Runnable mUpdateTimeTask = new Runnable(){
  public void run(){
    mHandler.removeCallbacks(mUpdateTimeTask);
    if(monitoringCanRun){
      mHandler.postDelayed(mUpdateTimeTask, 1000);
      float parametervalue = Monitor.getParameterValue();
      Log.i(this.getClass().getSimpleName(),
            "-> "
                + Thread.currentThread().getStackTrace()[2]
                    .getMethodName()
                + " parameterValue="
                + String.format("%4.2", parameter_value));
    }
  }
};

此外,为什么不将数据保存到全局共享中并跨线程访问它呢。我认为按照您的操作方式,您应该能够访问线程数据。再说一遍,这只是一个想法。我希望这能有所帮助!

相关内容

最新更新