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
我正在做一个应用程序,其中我必须显示一系列图片:顺序如下:
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>