Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中带超时的Android重复任务_Java_Android_Concurrency - Fatal编程技术网

Java中带超时的Android重复任务

Java中带超时的Android重复任务,java,android,concurrency,Java,Android,Concurrency,我有重复任务的问题 基本上,我正在开发一项服务,它可以发送短信息并检查一分钟的响应。如果收到响应,我将用成功消息更新textview,否则将失败。 我的发送短信服务工作正常,但我一直无法接收短信。 我打电话发送短信并检查短信,如下所示: sendSms("6617", "Test") // it works; readSms.run() // it works too; if (message.equals("desired sms"){ // it doesn't wait read sms

我有重复任务的问题

基本上,我正在开发一项服务,它可以发送短信息并检查一分钟的响应。如果收到响应,我将用成功消息更新textview,否则将失败。 我的发送短信服务工作正常,但我一直无法接收短信。 我打电话发送短信并检查短信,如下所示:

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");
}
以下是
readSms

Runnable readSms = new Runnable(){
    receivedMessage = "";
    @Override
    public void run() {
        try {
            //..checking sms..//
            if (smsreceived) {message=receivedMessage;}
        } finally {
            mHandler.postDelayed(readSms, mInterval);
        }
    }
};
如何使
readSms
以1秒间隔等待60秒超时。如果收到短信,我应该成功更新textview,否则我将等待超时并将textview设置为fail。

您可以做的是:

  • 创建一个线程池
  • 将任务作为
    可调用的
    提交到线程池
  • 等待结果
  • 使用执行器创建线程池,例如:

    // Create a thread pool composed of only one thread in this case
    ExecutorService executor = Executors.newSingleThreadExecutor();
    
    以可调用的方式提交任务

    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);
            }
        }
    });
    
    如果在1分钟内无法检索结果,
    get
    方法将抛出
    TimeoutException


    NB:线程池不能在每次调用时创建,必须在类中一次性创建,以便在每次调用时重用它。

    检查AsyncTask,它是为Androiddo thread.sleep(1000*60)线程内的后台操作而设计的。这将使线程等待60秒,然后检查是否收到短信。使用倒计时
    try {
        String receivedMessage = result.get(1, TimeUnit.MINUTES);
    } catch (TimeoutException e) {
        // ok let's give up
    }