Android 如何使用服务和异步任务轮询服务器并更新UI
我目前正在使用ZXing条形码阅读器扫描二维码。使用API,ZXing代码有一个“onActivityResult()”方法来处理成功或失败的扫描 如果成功,我将调用checkQR类,它由一个异步任务组成。目前它只返回一次结果,因为它只在扫描后调用 如何在检测到某个文本(例如“it is done”)后,以30秒的间隔继续调用/轮询,更新textView并停止它(终止服务) 注意:CheckQR构造函数接受上下文和文本视图。 orderstatus是我希望从服务器更新响应的文本视图 onActivityResult()的部分代码Android 如何使用服务和异步任务轮询服务器并更新UI,android,android-asynctask,polling,Android,Android Asynctask,Polling,我目前正在使用ZXing条形码阅读器扫描二维码。使用API,ZXing代码有一个“onActivityResult()”方法来处理成功或失败的扫描 如果成功,我将调用checkQR类,它由一个异步任务组成。目前它只返回一次结果,因为它只在扫描后调用 如何在检测到某个文本(例如“it is done”)后,以30秒的间隔继续调用/轮询,更新textView并停止它(终止服务) 注意:CheckQR构造函数接受上下文和文本视图。 orderstatus是我希望从服务器更新响应的文本视图 onActi
你的问题有太多的警告。 是否希望此计划程序在“活动”之外继续运行? 您是否希望严格地每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;
}