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