Java 恢复应用程序时线程重置
求你了,我需要帮助!! 我创建了一个应用程序,它通过单独的线程(ReadingProcessor)从arduino读取数据,并将值填充到读数[],然后我创建了另一个单独的线程来检查这些值。在该检查中,如果是第一次出现警告,则应用程序将发送消息,否则,如果之前有警告读数,则应用程序应等待,直到超过警告间隔Java 恢复应用程序时线程重置,java,android,multithreading,arduino,Java,Android,Multithreading,Arduino,求你了,我需要帮助!! 我创建了一个应用程序,它通过单独的线程(ReadingProcessor)从arduino读取数据,并将值填充到读数[],然后我创建了另一个单独的线程来检查这些值。在该检查中,如果是第一次出现警告,则应用程序将发送消息,否则,如果之前有警告读数,则应用程序应等待,直到超过警告间隔 public class WarningProcessor extends Thread { float readings[]; float[] min, max; long elapsedT
public class WarningProcessor extends Thread {
float readings[];
float[] min, max;
long elapsedTime;
long[] lastWarningTime;
boolean[] inWarning;
long checkInterval = Long.parseLong(Settings.Swarning) * 60000;
long currentTime;
SerialActivity sa = new SerialActivity();
WarningProcessor(float readings[]) {
this.readings = readings;
}
@Override
public void run() {
sleep_s(2);
synchronized (readings) {
lastWarningTime = new long[readings.length];
inWarning = new boolean[readings.length];
Arrays.fill(inWarning, false);
}
while (true) {
this.readings = ReadingProcessor.readings;
synchronized (readings) {
for (int i = 0; i < readings.length; i++) {
currentTime = Calendar.getInstance().getTimeInMillis();
if (readings[i] > 100) { //here to make boundaries
if (inWarning[i] == false) {
//send warning
for(String number : StartPage.phoneNumbers)
SmsManager.getDefault().sendTextMessage(number,
null,"Warning "+readings[i], null, null);
lastWarningTime[i] = currentTime;
inWarning[i] = true;
} else {
if (currentTime - lastWarningTime[i] > checkInterval) {
//send warning
for(String number : StartPage.phoneNumbers)
SmsManager.getDefault().sendTextMessage(number,
null,"Warning "+readings[i], null, null);
lastWarningTime[i] = currentTime;
}
}
} else {
inWarning[i] = false;
}
}
}
sleep_s(1);
}
}
所以请帮帮我,我尝试了太多的解决方案,比如使用handler,我遇到了相同的问题每次将应用程序返回前台时都会调用onStart。您的问题是每个线程都有多个实例在运行。如果您只希望每个线程运行一个实例,则需要在onCreate而不是onStart中创建和启动线程。通常,如果要在onPause中终止线程,则只应在onStart中启动它
public class SerialActivity extends Activity {
private static ArduinoSerialDriver sDriver;
private static TextView mDumpTextView;
private static ScrollView mScrollView;
String Data[]={"Temperature"};
float[] readings = new float[Data.length];
ReadingProcessor readingProcessor;
WarningProcessor warningProcessor;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.serialactivity);
mDumpTextView = (TextView) findViewById(R.id.consoleText);
mScrollView = (ScrollView) findViewById(R.id.demoScroller);}
@Override
protected void onStart() {
super.onStart();
ReadingProcessor rp = new ReadingProcessor(readings,sDriver);
readingProcessor=rp;
WarningProcessor wp = new WarningProcessor(readings);
warningProcessor=wp;
rp.start();
wp.start();
}
@SuppressWarnings("deprecation")
@Override
protected void onDestroy() {
super.onDestroy();
readingProcessor.Stop();
warningProcessor.stop();
}