有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在Android上模拟客户端延迟而不挂起UI?

我有一个与后端web服务对话的Androd应用程序。作为测试的一部分,我需要在按下提交按钮时模拟不同长度的客户端延迟

现在,我正在使用线程。在我的OnClickListener中为我的submit按钮设置sleep(),但这样睡眠UI线程会产生意外的后果,导致应用程序看起来完全“冻结”——该按钮一直高亮显示,直到线程醒来,我的ProgressBar也完全冻结。这是我的密码:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_checkout);

    pBar = (ProgressBar) findViewById(R.id.progressBar1);
    pBar.setVisibility(View.INVISIBLE);

    Button submitButton = (Button) findViewById(R.id.btnSubmit);
    submitButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            pBar.setVisibility(View.VISIBLE);
            try {
                Thread.sleep(3000); //eventually this delay will be random
                                    //right now it obviously hangs the UI
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            performMyAppSpecificWorkHere();
            pBar.setVisibility(View.INVISIBLE);
            CheckoutActivity.this.finish();
        }
    });  
}

我正在寻找不挂起整个UI的情况下模拟延迟的方法。欢迎提出任何意见。谢谢

编辑

这里有一些澄清!我需要做的部分工作是模拟延迟,并允许用户界面干净地处理它(这是现在没有发生的事情)

即。。。如果客户机或web服务上存在延迟,客户机应该在等待时让微调器旋转来处理延迟。模拟后端延迟的功能已经完成,并且按照我希望的方式工作,但是我希望在客户端上模拟延迟而不挂起UI线程


共 (3) 个答案

  1. # 1 楼答案

    首先,不要阻塞主线程(ui线程),否则gui将被冻结!相反,使用^{},将^{}放在^{}内,然后在^{}内执行任何操作(^{}在主线程中运行)。检查相关问题

  2. # 2 楼答案

    我们开始吧:

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_checkout);
    
        pBar = (ProgressBar) findViewById(R.id.progressBar1);
        pBar.setVisibility(View.INVISIBLE);
    
        Button submitButton = (Button) findViewById(R.id.btnSubmit);
        submitButton.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
    
                Thread t=new Thread(new Runnable(){
                   @Override
                   public void run(){
                     try {
                      Thread.sleep(3000);
                     } catch (InterruptedException e) {
                       e.printStackTrace();
                     }
                     performMyAppSpecificWorkHere();
                     runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            pBar.setVisibility(View.INVISIBLE);
                            CheckoutActivity.this.finish();
                        }
                     }
                   }
                });
                pBar.setVisibility(View.VISIBLE);
                t.start();
            }
        });  
    }
    

    因此,您将在onClick事件中启动一个新线程。这个新线程应该在睡眠3秒后完成应用程序工作。之后,您需要更新一些ui对象,但不能从非ui线程的线程内部进行更新。这就是为什么有一个RunNuithRead(…)完成工作后。希望有帮助

  3. # 3 楼答案

    我认为您应该在这里澄清,您想要模拟服务器端延迟,而不是客户端延迟。您应该将睡眠代码放在服务器端代码中,而不是客户端代码中

    如果不是这样,您可以使用asyncTask并执行应用程序代码。您可以将睡眠代码放入其中,以模拟客户端延迟