I've a problem with repeated tasks.
Basically, I'm working on service, which sends sms and check response for a minute. If response received, I update textview with success message otherwise fail. My send sms service works ok, but I am stuck at receiving the sms. I call send sms and check sms like this:
sendSms("6617", "Test") // it works;
readSms.run() // it works too;
if (message.equals("desired sms"){ // it doesn't wait read sms to finish
updateTextView("Success");
}
else{
updateTextView("Fail");
}
Here is readSms:
Runnable readSms = new Runnable(){
receivedMessage = "";
@Override
public void run() {
try {
//..checking sms..//
if (smsreceived) {message=receivedMessage;}
} finally {
mHandler.postDelayed(readSms, mInterval);
}
}
};
How can I make readSms to wait 60 seconds timeout with 1 second interval. If sms received, I should update textview with success, if not I'll wait until timeout and set textview with fail.
What you can do is:
Callable to the thread poolCreate your thread pool using Executors like this for example:
// Create a thread pool composed of only one thread in this case
ExecutorService executor = Executors.newSingleThreadExecutor();
Submit your task as a Callable
Future<String> result = executor.submit(new Callable<String>(){
@Override
public String call() {
try {
//..checking sms..//
if (smsreceived) {return receivedMessage;}
return null;
} finally {
mHandler.postDelayed(readSms, mInterval);
}
}
});
Wait a minute for a result
try {
String receivedMessage = result.get(1, TimeUnit.MINUTES);
} catch (TimeoutException e) {
// ok let's give up
}
If the result cannot be retrieved within 1 minute the get method will throw a TimeoutException.
NB: The thread pool must not be created at each call, it must be created once for all in your class in order to reuse it at each call.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With