Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.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
Java 如何在Android上模拟客户端延迟而不挂起UI?_Java_Android_Unit Testing_Testing - Fatal编程技术网

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

Java 如何在Android上模拟客户端延迟而不挂起UI?,java,android,unit-testing,testing,Java,Android,Unit Testing,Testing,我有一个与后端web服务对话的Androd应用程序。作为测试的一部分,我需要在按下提交按钮时模拟不同长度的客户端延迟 现在,我在OnClickListener中为我的submit按钮使用Thread.sleep(),但是像这样睡眠UI线程会产生意外的后果,导致应用程序看起来完全“冻结”——该按钮一直高亮显示,直到线程醒来,我的ProgressBar也完全冻结。这是我的密码: public void onCreate(Bundle savedInstanceState) { super.o

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

现在,我在OnClickListener中为我的submit按钮使用Thread.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线程。

首先,不要阻塞主线程(UI线程),否则gui将被冻结!取而代之的是,在你放进去的地方使用,然后在里面做你想做的任何事情(在主线程中运行)。查看相关问题。

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

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

我们开始:

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(..)的原因。希望有帮助

不允许冻结UI。在单独的线程上运行每个网络操作。正确的工作流程应该是按Button->ShowDialog->StartNetwordThread(Simulation)->CompleteneWorkThread->HideDialog。是的,您需要runonuithread…仔细查看代码,您会发现在onClick方法中,我正在启动一个新线程..@Eng.Fouad。。。您不理解代码。请在表决前进行测试;)没错……这就是为什么线程在开始工作之前会休眠3秒!我会更新答案并解释一下我在做什么。我的解决方案与asyncTask完全相同,但没有所有asyncTask结构。正如@torgis所说,这是为了测试目的,一个普通线程应该可以完成这项工作+我的错,是我的错。您的代码应该运行正常。对不起,伙计!