我正在尝试实现一个允许用户插入密码的简单活动。 我有一个使用9个图像的gridview和4个将成为所选图像的图像视图(点击gridview上的项目时,相应的图像将被选中的图像填充)。
现在出现问题:我希望4个图像视图与密码字段类似:1秒钟显示所选项目,然后是另一个图像... 我尝试使用asyncthread,但我得到了错误:只有创建视图层次结构的原始线程才能触及其视图 这是我的代码:
@Override
protected String doInBackground(ImageView... imageViews) {
ImageView passField1 = imageViews[0];
ImageView passField2 = imageViews[1];
ImageView passField3 = imageViews[2];
ImageView passField4 = imageViews[3];
try {
switch (currentField) {
case 1:
passField1.setImageResource(//selected recource on grid view);
Thread.sleep(1000);
passField1.setImageResource(R.drawable.e00); //this is a blank image
break;
case 2:
passField2.setImageResource(//selected recource on grid view);
Thread.sleep(1000);
passField1.setImageResource(R.drawable.e00);
break;
case 3:
passField3.setImageResource(//selected recource on grid view);
Thread.sleep(1000);
passField1.setImageResource(R.drawable.e00);
break;
case 4:
passField4.setImageResource(//selected recource on grid view);
Thread.sleep(1000);
passField1.setImageResource(R.drawable.e00);
break;
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
答案 0 :(得分:2)
我认为您最好在ImageViews的onClickListener中使用View.postDelayed(Runnable, long)来执行此操作。
答案 1 :(得分:0)
方法1)
让线程在doInBackground
中休眠,但在
@Override
protected void onPostExecute(Void aVoid) {}
AsyncTask的方法。此方法可以访问UI线程。
方法2)
另一种方法可能是使用
YourActivity.this.runOnUiThread(new Runnable() {
public void run() {
YourActivity.this.passField1.setImageResource(R.drawable.e00)
}
});
(从doInBackground调用),其中passfield不是局部变量而是类变量。
但是方法1是首选方式,我建议您首先尝试这种方式。