Android 在独立线程检测到对象状态发生更改后更新UI

Android 在独立线程检测到对象状态发生更改后更新UI,android,multithreading,concurrency,Android,Multithreading,Concurrency,我目前正在研究一个经典的多线程问题(我还在学习多线程)。在我的应用程序中,我通过点击按钮向一个网站发送一个请求,然后有一个类反复请求该网站每10秒查看一次是否有更改。一旦注意到更改,UI应该更新。我想确保这个过程是在一个单独的线程上完成的,这样它就不会干扰UI。我尝试过使用ScheduledExecutorService,但是我被困在可运行线程意识到发生了更改的部分,无法返回一个值来让主进程知道更新UI。我该如何处理这个问题?提前谢谢 UI\u FragmentClass.java presen

我目前正在研究一个经典的多线程问题(我还在学习多线程)。在我的应用程序中,我通过点击按钮向一个网站发送一个请求,然后有一个类反复请求该网站每10秒查看一次是否有更改。一旦注意到更改,UI应该更新。我想确保这个过程是在一个单独的线程上完成的,这样它就不会干扰UI。我尝试过使用ScheduledExecutorService,但是我被困在可运行线程意识到发生了更改的部分,无法返回一个值来让主进程知道更新UI。我该如何处理这个问题?提前谢谢

UI\u FragmentClass.java presenterClass.java
有几种方法可以实现这一点

  • 创建一个后台服务来检查网站的更新
  • 如果发现更新,则发送广播接收器通知UI填充更新
  • 看起来你的手机在安卓系统中也是新的。下面是一些示例,不建议每隔X秒执行一次网络请求。尝试实施另一种解决方法

    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);
    
    }