延迟在Android中执行代码的问题

时间:2016-02-24 14:43:04

标签: android multithreading wait i2c

我已经实现了一个可以通过i2c通信与metawear设备通信的应用程序。我现在遇到的问题是,在发送写入命令后,我需要等待一段时间,直到我读取值(大约150ms)。

我遇到的问题是它没有等到那个特定的时间。我使用了TimeUnit,Thread.sleep和wait函数,但仍然没有延迟我希望它执行下一行代码。这是我实现的功能:

module.exports = {
    entry: './src/example.js',
    output: {
        filename: "./dist/example.js",
        library: "Example",
        libraryTarget: "var"
    },
    module: {
        loaders: [
            {
                exclude: /(node_modules|bower_components)/,
                loader: 'babel',
                query: {
                    presets: ['es2015']
                }
            }
        ]
    }
};

我希望它在执行 @Override protected void test_application(){ timerModule.scheduleTask(new Timer.Task() { @Override public void commands() { i2cModule.writeData((byte) 0x34, (byte) 0xA0, new byte[]{(byte) 0x98}); //We need to wait >80ms for the ADC to finish the conversion value // synchronized (this) { // try { // wait(150); // } catch (InterruptedException e) { // e.printStackTrace(); // } //} try{ TimeUnit.MILLISECONDS.sleep(150); } catch (InterruptedException e){ e.printStackTrace(); } //try{ // Thread.currentThread().sleep(150); //} catch (InterruptedException e){ // e.printStackTrace(); //}; //After waiting 150ms for the conversion time, we read the output value through the I2C line i2cModule.readData((byte)0x34, (byte)0x00, (byte)4).onComplete(new CompletionHandler<byte[]>() { @Override public void success(byte[] result) { auxvar = result; } }); finalvoltage = ((auxvar[0]&0x3F)<<18)|(auxvar[1]<<10)|(auxvar[2]<<2)|((auxvar[3]&0xC0)); diff_volt1 = (float)finalvoltage * 3/16777215; LineData data = chart.getData(); if (startTime == -1) { data.addXValue("0"); startTime= System.currentTimeMillis(); } else { data.addXValue(String.format("%.2f", (System.currentTimeMillis() - startTime) / 1000.f)); } data.addEntry(new Entry(diff_volt1, sampleCount), 0); sampleCount++; } }, 500, false).onComplete(new AsyncOperation.CompletionHandler<Timer.Controller>() { @Override public void success(Timer.Controller result) { result.start(); } }); 函数之前等待。这是来自逻辑分析器的捕获,以便您可以看到它在读取数据之前不会等待

enter image description here

有谁知道如何实现这个或解决这个问题?不管怎样,谢谢。

编辑:我已将写入命令更改为一行,逻辑分析仪的新输出如下:

i2cmodule.readData()

新输出如下:

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:0)

通常,如果命令是异步的,则等待命令完成是一个坏主意。在执行.writeData()方法之前,您需要确保.readData()方法已完成。

有很多方法可以做到这一点。我喜欢监听器模式,但为此你也可以使用抽象类构造。

基本思想是实现一个类(让我们调用这个DataWriter),在完成数据写入后立即调用抽象方法。

一个非常基本的例子是:

类定义

abstract class DataWriter {
     public DataWriter() {
         doWritingFunction();
     }

     private void doWritingFunction() {
          //here you do your writing operation
          //when it's done it calls:
          onWritingDone();
     }

     abstract void onWritingDone();
 }

然后你像这样实例化你的类:

DataWriter dataWriter = new DataWriter() {

       @Override
       void onWritingDone() {
            //do data read here      
       }

 };

永远不要使用Thread.sleep()等待异步任务完成,因为你永远不知道它什么时候完成