Android 在独立线程检测到对象状态发生更改后更新UI
我目前正在研究一个经典的多线程问题(我还在学习多线程)。在我的应用程序中,我通过点击按钮向一个网站发送一个请求,然后有一个类反复请求该网站每10秒查看一次是否有更改。一旦注意到更改,UI应该更新。我想确保这个过程是在一个单独的线程上完成的,这样它就不会干扰UI。我尝试过使用ScheduledExecutorService,但是我被困在可运行线程意识到发生了更改的部分,无法返回一个值来让主进程知道更新UI。我该如何处理这个问题?提前谢谢 UI\u FragmentClass.java presenterClass.javaAndroid 在独立线程检测到对象状态发生更改后更新UI,android,multithreading,concurrency,Android,Multithreading,Concurrency,我目前正在研究一个经典的多线程问题(我还在学习多线程)。在我的应用程序中,我通过点击按钮向一个网站发送一个请求,然后有一个类反复请求该网站每10秒查看一次是否有更改。一旦注意到更改,UI应该更新。我想确保这个过程是在一个单独的线程上完成的,这样它就不会干扰UI。我尝试过使用ScheduledExecutorService,但是我被困在可运行线程意识到发生了更改的部分,无法返回一个值来让主进程知道更新UI。我该如何处理这个问题?提前谢谢 UI\u FragmentClass.java presen
有几种方法可以实现这一点
sendPollCmd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(!currentModuleInfo.getEngStatus().equals("POLL")){
AlertDialog.Builder builder = new
AlertDialog.Builder(getActivity());
builder.setMessage("Confirm Send Poll Command? This may take a few minutes.").setPositiveButton("Confirm", new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
mPresenter.commandSequence("POLL", currentModuleInfo.getItemid(), "");
Toast.makeText(getActivity(), "Poll Command sent...Waiting for response", Toast.LENGTH_LONG).show();
mPresenter.checkForUpdate(currentModuleInfo.getItemid(), currentModuleInfo.getEngStatus(), currentModuleInfo.getTime());
}
}).setNegativeButton("Cancel",null);
AlertDialog alert = builder.create();
alert.show();
}
}
});
public void checkForUpdate(String id, String engStatus, String lstMsgTime) {
class Check implements Runnable {
String iden, eng, time;
Check( String id, String engStatus, String lstMsgTime) {
iden = id;
eng = engStatus;
time = lstMsgTime;
}
public void run() {
Module check = getIndividualModule(iden);
System.out.println("------------------------------------");
System.out.println("LOCAL");
System.out.println("engine status: " + eng);
System.out.println("time: " + time);
System.out.println("\n" + "CURRENT");
System.out.println("engine status: " + check.getEngStatus());
System.out.println("time: " + check.getTime());
System.out.println("------------------------------------");
if (!check.getEngStatus().equals(eng) || !check.getTime().equals(time)){
System.out.println("CHANGE DETECTED");
System.out.println("update panel");
return;
}
}
}
ScheduledExecutorService executor = Executors.newScheduledThreadPool(0);
executor.scheduleAtFixedRate(new Check(id, engStatus, lstMsgTime), 10, 10, TimeUnit.SECONDS);
}