Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.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
Android 如何使用服务和异步任务轮询服务器并更新UI_Android_Android Asynctask_Polling - Fatal编程技术网

Android 如何使用服务和异步任务轮询服务器并更新UI

Android 如何使用服务和异步任务轮询服务器并更新UI,android,android-asynctask,polling,Android,Android Asynctask,Polling,我目前正在使用ZXing条形码阅读器扫描二维码。使用API,ZXing代码有一个“onActivityResult()”方法来处理成功或失败的扫描 如果成功,我将调用checkQR类,它由一个异步任务组成。目前它只返回一次结果,因为它只在扫描后调用 如何在检测到某个文本(例如“it is done”)后,以30秒的间隔继续调用/轮询,更新textView并停止它(终止服务) 注意:CheckQR构造函数接受上下文和文本视图。 orderstatus是我希望从服务器更新响应的文本视图 onActi

我目前正在使用ZXing条形码阅读器扫描二维码。使用API,ZXing代码有一个“onActivityResult()”方法来处理成功或失败的扫描

如果成功,我将调用checkQR类,它由一个异步任务组成。目前它只返回一次结果,因为它只在扫描后调用

如何在检测到某个文本(例如“it is done”)后,以30秒的间隔继续调用/轮询,更新textView并停止它(终止服务)

注意:CheckQR构造函数接受上下文和文本视图。 orderstatus是我希望从服务器更新响应的文本视图

onActivityResult()的部分代码


你的问题有太多的警告。 是否希望此计划程序在“活动”之外继续运行? 您是否希望严格地每30秒调用一次CheckQR,即使前一次尚未完成

我假设只要您的活动存在,您就想调用CheckQR,因为它会更新
TextView
。 因此,如果您想在CheckQR完成后开始进行链式调用,那么只需使用
onpostexute
中的
Handler
递归执行即可

private CheckQR cqr;

class CheckQR extends AsyncTask<Void, Void, String>{

    @Override
    protected String doInBackground(Void... voids) {
        if (isCancelled()){
            return null;
        }
        String res = httpCall();
        return res;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        if (result == null || isCancelled() || result.equals("it is done")){
            return;
        }
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                cqr = new CheckQR();
                cqr.execute();
            }
        }, 30000);
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    cqr.cancel(true);
}
在onDestroy进行清理

@Override
protected void onDestroy() {
    super.onDestroy();
    scheduledFuture.cancel(false);
    flagActivityOnDestroyedRaised = true; 
}

这段代码只是一段伪代码。您需要在这里声明一些引用作为实例变量,并使用正确的方法。如果您使用
ScheduledExecutorService
,则需要使用
runOnUiThread

将您的异步任务展开为
Thread
,是否每30秒执行一次CheckQR(此,订单状态)?@inmystry是的,因为CheckQR包含异步任务的代码。您好@inmystry,您能帮我一下吗?其他人能帮我吗?我看到很多人推荐“runInUiThread()”,但我不知道如何实现它。我和Handler一起去的,它现在似乎可以每隔一段时间进行投票。但我在“onActivityResult()”中声明了它。CheckQR本身就是一个类。在AsyncTask中,runUnuithRead等于onPostExecute和onProgressUpdate,因为它们旨在像TextView一样更新UI。不过,如果您有时间,可以了解一下RxJava。这是破坏AsynTask的函数式编程范式。
        ScheduledExecutorService scheduler =
            Executors.newSingleThreadScheduledExecutor();

        ScheduledFuture scheduledFuture = scheduler.scheduleAtFixedRate
            (new Thread(){

                @Override
                public void run() {
                    //do blocking http call

                    if(stopCondition)//when stop condition is met
                        scheduledFuture.cancel(false);

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            if (!flagActivityOnDestroyedRaised){
                                // you need this flag to prevent 
                                // updating UI when Activity is already 
                                // destroyed
                                textView.setText("aaaa");
                            }

                        }
                    });
                }
            }, 0, 30, TimeUnit.SECONDS);
@Override
protected void onDestroy() {
    super.onDestroy();
    scheduledFuture.cancel(false);
    flagActivityOnDestroyedRaised = true; 
}