Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.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 runnable集合工作不正常-处理程序_Java_Android_Runnable_Android Handler - Fatal编程技术网

Java runnable集合工作不正常-处理程序

Java runnable集合工作不正常-处理程序,java,android,runnable,android-handler,Java,Android,Runnable,Android Handler,我正在做一个应用程序,其中我必须显示一系列图片:顺序如下: 红色X必须显示1000毫秒左右 称为“屏幕截图”的图像必须显示50分钟左右 毫秒 称为“噪音”的图像必须显示50分钟左右 毫秒 “噪波”图像消失,为编辑文本腾出空间 EditText用于获取用户数据 我的想法是使用一组runnable。代码如下: private void startThread0(){ handler.postDelayed(new TaskCross(), 1000); handler.postDel


我正在做一个应用程序,其中我必须显示一系列图片:顺序如下:

  • 红色X必须显示1000毫秒左右
  • 称为“屏幕截图”的图像必须显示50分钟左右 毫秒
  • 称为“噪音”的图像必须显示50分钟左右 毫秒
  • “噪波”图像消失,为编辑文本腾出空间
  • EditText
    用于获取用户数据

    我的想法是使用一组runnable。代码如下:

    private void startThread0(){
        handler.postDelayed(new TaskCross(), 1000);
        handler.postDelayed(new TaskScreenshot(0), 2000);
        handler.postDelayed(new TaskNoise(), 2100);
        handler.postDelayed(new TaskEditText(), 3000);
    
        myEditText.setOnKeyListener(null);
    
        myEditText.setOnKeyListener(new View.OnKeyListener(){
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                System.out.println("KEY ENTER!!!!!");
                if((keyCode == KeyEvent.KEYCODE_ENTER)) {
                    if(myEditText.getText().toString().equals("")){
                        Toast.makeText(getApplicationContext(), "Inserire un numero da 1 a 9", Toast.LENGTH_SHORT).show();
                        return false;
                    } else if (Integer.parseInt(myEditText.getText().toString()) >= 1 &&
                            Integer.parseInt(myEditText.getText().toString()) <= 9){
                        startThread1(1);
                        return true;
                    }
                }
                return false;
            }       
        });
    }
    
    private void startThread1(final int i){     
    
        if(i < length){
            handler.postDelayed(new TaskCross(), 1000);
            handler.postDelayed(new TaskScreenshot(i), 2000);
            handler.postDelayed(new TaskNoise(), 2100);
            handler.postDelayed(new TaskEditText(), 3000);
    
            myEditText.setOnKeyListener(null);
    
            myEditText.setOnKeyListener(new View.OnKeyListener(){
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                    System.out.println("KEY ENTER!!!!!");
                    if((keyCode == KeyEvent.KEYCODE_ENTER)) {
                        if(myEditText.getText().toString().equals("")){
                            Toast.makeText(getApplicationContext(), "Inserire un numero da 1 a 9", Toast.LENGTH_SHORT).show();
                            return false;
                        } else if (Integer.parseInt(myEditText.getText().toString()) >= 1 &&
                                Integer.parseInt(myEditText.getText().toString()) <= 9){
                            startThread1(i+1);
                            return true;
                        }
                    }
                    return false;
                }       
            });
    
            if(i == length-1 && myEditText.getVisibility() == View.VISIBLE){            
                continueButton.setVisibility(View.VISIBLE);
            }
        }
    }
    

    现在,当我尝试执行线程时,这是logcat上的结果:

    Cross
    Screenshot --> 0
    Noise
    EditText
    
    Cross
    Cross
    Screenshot --> 1
    Screenshot --> 2
    Noise
    Noise
    EditText
    EditText
    
    Cross
    Cross
    Screenshot --> 3
    Screenshot --> 4
    Noise
    Noise
    EditText
    EditText
    
    因此,第一个屏幕截图是正确的,之后,其他屏幕截图一次显示两个。为什么?
    处理程序的计时器是否有问题

    谢谢

    您的可运行程序是在似乎是主线程处理程序而不是线程池上执行的。Runnable只是一个用于委派任务执行的接口

    现在,我强烈建议在大多数情况下使用AnimationDrawable,而不是尝试重新发明轮子

    <animation-list android:oneshot="true">
        <item android:drawable="@drawable/cross300x300" android:duration="1000" />
        <item android:drawable="@drawable/googleplaybooks2" android:duration="50" />
        <item android:drawable="@drawable/aldiko1" android:duration="50" />
        <item android:drawable="@drawable/chaton2" android:duration="50" />
        <item android:drawable="@drawable/cinetrailer1" android:duration="50" />
        <item android:drawable="@drawable/fanpage1" android:duration="50" />
        <item android:drawable="@drawable/noise" android:duration="50" />
    </animation-list>
    
    
    
    您还没有发布其余视图和布局的设置方式,因此很难说将其与代码集成的最佳方式。但无论您如何操作,都可以使用AnimationDrawable.start()开始动画。要转换为EditText,可以使用AnimationDrawable.getDuration()向处理程序发送延迟消息或Runnable。或者您可以使用子类化


    希望这能让您的代码走上一条更好(不那么复杂)的道路。

    您在这里发布了很多代码。如果你把它缩小到你遇到问题的地方,你会有更多的运气。我知道这是很多代码,但我认为问题出在我发布的代码中的某个地方。我建议你首先重构,然后。你有大量的重复,这使得你很难对发生的事情进行推理。你想尽量减少一个人为了帮助你而必须做的工作量。删除重复项并使用有意义的变量名(而不是
    i
    j
    y
    ,等等),我猜您将能够自己发现问题。我已经更新了代码。在Android上处理线程时,最好使用AsyncTask类。我不完全确定你想在这里做什么,但AsycTask很可能更容易处理它;对阵列中的每个屏幕截图重复此序列。
    Cross
    Screenshot --> 0
    Noise
    EditText
    
    Cross
    Cross
    Screenshot --> 1
    Screenshot --> 2
    Noise
    Noise
    EditText
    EditText
    
    Cross
    Cross
    Screenshot --> 3
    Screenshot --> 4
    Noise
    Noise
    EditText
    EditText
    
    <animation-list android:oneshot="true">
        <item android:drawable="@drawable/cross300x300" android:duration="1000" />
        <item android:drawable="@drawable/googleplaybooks2" android:duration="50" />
        <item android:drawable="@drawable/aldiko1" android:duration="50" />
        <item android:drawable="@drawable/chaton2" android:duration="50" />
        <item android:drawable="@drawable/cinetrailer1" android:duration="50" />
        <item android:drawable="@drawable/fanpage1" android:duration="50" />
        <item android:drawable="@drawable/noise" android:duration="50" />
    </animation-list>