2011-11-09 43 views
-1

我试图从sdcard中的特定文件夹显示一系列图像 - 以幻灯片的形式。 filelist []包含该目录中存在的所有文件的名称。无法执行基于thread.sleep的循环

我在这里过滤出图像。接下来,thread.sleep(1000)似乎没有任何作用。在1000毫秒后只显示目录中的最后一个图像。我哪里错了?任何其他方式,我可以做到这一点?

也许我已经完全错了。我是一个新手,所以plz的帮助。

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

发布整个活动代码。如果您使用的是线程,请确保您在UI线程上完成的imageview更改不在工作线程中。 – user370305

+0

你确定filelist里面有1个以上的图像吗?如果在循环之前过滤列表,是否有可能以某种方式过滤了除最后一个图像以外的所有内容? – brianestey

+0

嗨有, 你可以尝试TimerTask。 – Lucifer

回答

0

ü必须在应用了Thread.sleep()方法

1

在Android中的行为像这将使UI线程睡眠之前,在当前对象同步。这会冻结手机的整个用户界面,你的应用程序看起来会崩溃,系统会在一段时间后自动终止你的应用程序。

有一个机制来改变特定时间intervalls中的东西。你应该使用这个处理程序来做到这一点。 Handlers

处理程序有一个postDelayedsendMessageDelayed方法,使您无论是建立,将在一定时间后执行的Runnable或发送必须由您处理程序的实现进行处理的消息。

处理程序的初始化会是这个样子:

showNextImageHandler = new Handler() { 
    @Override 
    public void handleMessage(android.os.Message msg) { 
     showNextImage(); 
    } 
}; 

showNextImageHandler.sendMessageDelayed(showNextImageHandler.obtainMessage(), 1000); 

这段代码创建一个新的处理程序每​​收到一个消息时,调用该函数showNextImage。我会将Handler存储在您的活动的实例变量中,以便稍后发送更多消息。处理程序创建后,第一个空的消息将以延迟发送消息1000毫秒的方式发送。一秒钟后,showNextImage函数将被调用。在此功能中,您可以更改视图,并且如果存在下一个图像,则可以张贴另一个延迟的消息以稍后触发对该功能的另一个呼叫。