Java 数据的快速处理

Java 数据的快速处理,java,android,multithreading,performance,android-progressbar,Java,Android,Multithreading,Performance,Android Progressbar,我的应用程序每80毫秒获取一次数据(我今天问我的老板,他说80毫秒没问题,但最好是2毫秒到20毫秒,所以比我想象的还要快)。我需要处理传入的消息,因此我尝试使用if子句来处理它们,并且每当if子句为true时,TextView if (data.equalsIgnoreCase(TEST)){ mProgressBar.setProgress(0); } 就像这样: if (data.equalsIgnoreCase(test)) { TextView tv = (TextVi

我的应用程序每80毫秒获取一次数据(我今天问我的老板,他说80毫秒没问题,但最好是2毫秒到20毫秒,所以比我想象的还要快)。我需要处理传入的消息,因此我尝试使用if子句来处理它们,并且每当if子句为true时,
TextView

if (data.equalsIgnoreCase(TEST)){
    mProgressBar.setProgress(0);
}
就像这样:

if (data.equalsIgnoreCase(test)) {
    TextView tv = (TextView) findViewById(R.id.textview);
    tv.setText(" 30 % ");
}
问题是,数据传入的速度太快,而if子句似乎不够快,无法处理它

TextView
仅在我停止消息传输时更改,然后在短暂的“等待”后
TextView
更改

有什么东西可以让它更“实时”吗

我没有通过谷歌找到什么有用的东西,我的编程技能也很弱,只是为了防止更多的反对票

编辑:

我现在发现,我必须检查768个不同的值(所有十六进制代码)。因此将有768个if语句。那肯定会破坏速度

问题是,我不能“等待”先执行if语句,然后再获取下一条消息

信息就这样源源不断地进来了

我刚刚更新了我的代码,现在使用
ProgressBar
而不是
TextView

if (data.equalsIgnoreCase(TEST)){
    mProgressBar.setProgress(0);
}
EDIT2:添加了
Thread
code

class RxThread extends Thread { 
    private static final String TEST =  "0 0 0 0 0 40 0 0 ";
private static final String TEST2 = "0 1 0 0 0 41 0 0 ";
private static final String TEST3 = "2 bb 0 0 2 fb 0 0 ";
private static final String TEST4 = "2 bd 0 0 2 fd 0 0 ";
private static final String TEST5 = "2 be 0 0 2 fe 0 0 ";

Handler myHandler = new Handler();

final Runnable r = new Runnable() {
    public void run() {

        demoRxMsg = new MessageStructure();

        while (rxChannel.receiveMessage(demoRxMsg) == ReturnCode.SUCCESS) {

            String data = "";
            String format = "";

            rxChannel.receiveMessage(demoRxMsg);

            if (demoRxMsg.frameFormat == API_ADK.STANDARD_FRAME) {
                format = "SFF";
            } else {
                format = "EFF";
            }
            for (byte i = 0; i < demoRxMsg.dataLength; i++) {
                data = data + Integer.toHexString(demoRxMsg.data[i]) + " ";
            }

            if (data.equalsIgnoreCase(TEST)){
                mProgressBar.setProgress(0);
            } else if (data.equalsIgnoreCase(TEST2)) {
                mProgressBar.setProgress(1);
            } else if (data.equalsIgnoreCase(TEST3)) {
                mProgressBar.setProgress(94);
            } else if (data.equalsIgnoreCase(TEST4)) {
                mProgressBar.setProgress(95);
            } else if (data.equalsIgnoreCase(TEST5)) {
                mProgressBar.setProgress(96);
            }

            }
        }
    }   
};

public void run() {
    while (true) {
        try {
            Thread.sleep(60);
            myHandler.post(r);
        } catch (InterruptedException e) {
            break;
        }
    }
}
class RxThread扩展线程{
私有静态最终字符串测试=“0 0 40 0”;
私有静态最终字符串TEST2=“0 1 0 0 41 0 0”;
私有静态最终字符串TEST3=“2 bb 0 0 2 fb 0 0”;
私有静态最终字符串TEST4=“2 bd 0 0 2 fd 0 0”;
私有静态最终字符串TEST5=“2 be 0 0 2 fe 0”;
Handler myHandler=newhandler();
最终可运行r=新可运行(){
公开募捐{
demoRxMsg=新消息结构();
while(rxChannel.receiveMessage(demoRxMsg)=ReturnCode.SUCCESS){
字符串数据=”;
字符串格式=”;
rxChannel.receiveMessage(demoRxMsg);
if(demoRxMsg.frameFormat==API_ADK.STANDARD_FRAME){
format=“SFF”;
}否则{
format=“EFF”;
}
for(字节i=0;i
如何让它表现得更好

编辑3:

为了更好地解释它必须有多快:

现在我每80毫秒收到一条十六进制格式的消息。消息对象有5项:帧格式、数据格式、数据长度、消息ID和数据。在完美的情况下,我每2-20毫秒就会得到一个

我必须区分768条不同的信息。这些消息的间隔为200(以获得0.5%的步长)

我想要的是一个
ProgressBar
,它随着hexcode“rain”的出现和百分比状态的改变而改变并流畅地运行


一个问题是,我对消息的接收速度没有影响。速度总是一样的。甚至可以如此快速地处理数据吗?

在您的特殊情况下,确实有可能进行优化
findViewById()
是一个非常昂贵的操作,您应该尝试缓存以加速上面显示的代码。仔细阅读,然后像这样实施:

private TextView tv;

[...]

if (data.equalsIgnoreCase(test)) {
    if (tv == null) {
        tv = (TextView) findViewById(R.id.textview);
    }
    tv.setText(" 30 % ");
}
但是已经说过,这可能不足以在应用程序中产生您想要的效果。80ms的速度非常快,如果有繁重的工作正在进行,Android往往会永远阻止UI线程

因此,您必须考虑线程,并且可能需要重新设计一点


我的第一个想法是让输入队列在一个单独的线程上运行,并且当您确定中间有某种停顿时,仅调用
TextView
更改。然后,您可以更新视图,因为您知道这可能非常快,即使所有消息都在那里,用户也无法识别它。

您可以使用一个变量保存更新信息(使其更新/读取线程安全),并让UI线程负责更新。UI线程应从中读取数据并更新其
视图。“更新”线程在收到消息时应修改此变量


您可以将
Runnable
发布到更新
TextView
的UI线程,然后重新安排自己在此之后运行。通过这种方式,您将获得最大的性能,因为重新调度
可运行的
将允许UI线程完成渲染更新的信息,然后立即返回到更新信息,然后重新渲染,依此类推。这样做的一个很好的副作用是您允许UI线程也处理用户输入事件。

虽然我不确定这是否是主要问题,但我确实发现您的代码中存在相当多的低效:

  • 您正在使用此工具创建许多瞬态对象

        for (byte i = 0; i < demoRxMsg.dataLength; i++) {
            data = data + Integer.toHexString(demoRxMsg.data[i]) + " ";
        }
    
    } }


  • 忘了提一下:它已经在一个sperate线程中运行了:)但是对于你的tipp,你应该编辑你的问题,以显示你在多线程方面所做的努力-
    class RxThread extends Thread {
    private static final String TEST = "0 0 0 0 0 40 0 0 ";
    private static final String TEST2 = "0 1 0 0 0 41 0 0 ";
    private static final String TEST3 = "2 bb 0 0 2 fb 0 0 ";
    private static final String TEST4 = "2 bd 0 0 2 fd 0 0 ";
    private static final String TEST5 = "2 be 0 0 2 fe 0 0 ";
    
    Handler myHandler = new Handler();
    
    public void run() {
    while (true) {
        try {
            Thread.sleep(60);
    
            demoRxMsg = new MessageStructure();
    
            int progress = -1;
            while (rxChannel.receiveMessage(demoRxMsg) == ReturnCode.SUCCESS) {
    
                String data = "";
                String format = "";
    
                rxChannel.receiveMessage(demoRxMsg);
    
                if (demoRxMsg.frameFormat == API_ADK.STANDARD_FRAME) {
                    format = "SFF";
                } else {
                    format = "EFF";
                }
                for (byte i = 0; i < demoRxMsg.dataLength; i++) {
                    data = data + Integer.toHexString(demoRxMsg.data[i])
                            + " ";
                }
    
                if (data.equalsIgnoreCase(TEST)) {
                    progress = 0;
                } else if (data.equalsIgnoreCase(TEST2)) {
                    progress = 1;
                } else if (data.equalsIgnoreCase(TEST3)) {
                    progress = 94;
                } else if (data.equalsIgnoreCase(TEST4)) {
                    progress = 95;
                } else if (data.equalsIgnoreCase(TEST5)) {
                    progress = 96;
                }
            }
            if (progress != -1) {
                final int newProgress = progress;
    
                myHandler.post(new Runnable() {
                    public void run() {
                        mProgressBar.setProgress(newProgress);
                    }
                });
            }
        } catch (InterruptedException e) {
            break;
        }
    }