我正在尝试以幻灯片形式显示sdcard中特定文件夹中的一系列图像。 filelist [] 包含该目录中存在的所有文件的名称。
我在这里过滤掉了这些图片。接下来,thread.sleep(1000)似乎没有任何效果。在1000ms的时间之后,仅显示目录中的最后一个图像。我哪里错了?我能用其他任何方式完成这个任务吗?
也许我完全错了。我是新手,所以请帮忙。
public class List_imgActivity extends Activity {
/** Called when the activity is first created. */
Bitmap[] bitmapArray = new Bitmap[1000];
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button pf=(Button) findViewById(R.id.pick_button);
pf.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent("org.openintents.action.PICK_DIRECTORY");
intent.setData(Uri.parse("file:///sdcard"));
intent.putExtra("org.openintents.extra.TITLE", "Please select a folder");
intent.putExtra("org.openintents.extra.BUTTON_TEXT", "Use this folder");
startActivityForResult(intent, 1);
}
});
}
protected void onActivityResult(int requestCode, int recievecode, Intent intent)
{
if (requestCode == 1 )
{
Uri uri = intent.getData();
try {
File f=new File(new URI(uri.toString()));
final String nx=f.toString();
if(f.isDirectory()) {
File filelist[] = f.listFiles();
for(int i=0;i<filelist.length;i++)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String filename = filelist[i].getName();
int pos = filename.lastIndexOf(".");
String ext = filename.substring(pos);
if(ext.equals(".jpg"))
{
TextView tv1= (TextView) findViewById(R.id.textView1);
tv1.setText(filelist[i].toString());
ImageView iv1=(ImageView) findViewById(R.id.imageView1);
bitmapArray[i] = BitmapFactory.decodeFile(filelist[i].toString());
iv1.setImageBitmap(bitmapArray[i]);
}
}
}
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
答案 0 :(得分:1)
在这样的Android行为中,会让UI-Thread进入睡眠状态。这将冻结手机的整个用户界面,你的应用程序看起来会崩溃给用户,系统会在一段时间后自动终止你的应用程序。
有一种机制可以在特定时间间隔内更改内容。您应该使用此处理程序来执行此操作。 Handlers
处理程序具有postDelayed和sendMessageDelayed方法,允许您构建将在特定时间之后执行的Runnable,或者发送必须由处理程序的实现处理的消息。
处理程序的初始化看起来像这样:
showNextImageHandler = new Handler() {
@Override
public void handleMessage(android.os.Message msg) {
showNextImage();
}
};
showNextImageHandler.sendMessageDelayed(showNextImageHandler.obtainMessage(), 1000);
此代码创建一个新的处理程序,每次收到消息时都会调用showNextImage函数。我会将Handler存储在您活动的实例变量中,以便稍后发送更多消息。创建处理程序后,将以一种延迟发送消息1000毫秒的方式发送第一个空消息。一秒钟后,将调用showNextImage函数。在此功能中,您可以更改视图,如果存在下一个图像,您可以发布另一个延迟消息,以便稍后再触发该功能。
答案 1 :(得分:0)
U必须在应用Thread.sleep()方法
之前同步当前对象