2016-09-12 8 views
1

저는 사진 프레임의 일종 인 Xamarin으로 멀티 플랫폼 앱을 개발하고 있습니다. SDCARD에서 파일을 읽고 2 초마다 표시하고 싶습니다. 다음 코드의 결과로 나머지 이미지가 아닌 첫 번째 이미지 만 표시 할 수 있으며 그 이유는 알 수 없습니다. ImageView를 사용하여 각 이미지와 Timer 이벤트를 표시합니다.Xamarin의 ImageView에서 이미지를 변경하십시오.

using System; 
using System.IO; 
using System.Collections; 
using System.Timers; 
using Android.App; 
using Android.Content; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using Android.OS; 
using Android.Graphics; 

namespace TestSpeedWithXamarin 
{ 
    [Activity(Label = "TestBattteryWithXamarin", MainLauncher = true, Icon = "@drawable/icon")] 
    public class MainActivity : Activity 
    { 
     Timer t; 
     ArrayList imagesArray; 
     int actualImage; 
     ImageView imageView; 
     protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 

      SetContentView(Resource.Layout.Main); 
      string rutaInicial = "sdcard/DCIM/Camera"; 
      imagesArray = new ArrayList(); 
      try 
      { 
       DirectoryInfo di = new DirectoryInfo(rutaInicial); 
       foreach (var item in di.GetFileSystemInfos()) 
       { 
        if (item.Extension == ".jpg" || item.Extension == ".png") 
         imagesArray.Add(item.FullName); 
       } 

      } 
      catch (Exception ex) 
      { 
       Toast.MakeText(this, "problem ", ToastLength.Long).Show(); 
      } 
      if (imagesArray.Count > 0) 
      { 
       t = new Timer(2000); 
       t.Elapsed += OnTimedEvent; 
       actualImage = 0; 
       t.Enabled = true; 
       mostrarImagen((String)imagesArray[0]); 
      } 
     } 
     private void OnTimedEvent(Object source,ElapsedEventArgs e) { 
      if (actualImage < imagesArray.Count-1) 
      { 
       actualImage++; 
       //imageView = FindViewById<ImageView>(Resource.Id.imageView1); 
       Bitmap imageBitmap = BitmapFactory.DecodeFile((String)imagesArray[actualImage]); 
       imageView.SetImageBitmap(imageBitmap); 
       t.Start(); 
      } 
     } 

     private void mostrarImagen(string imagePath) { 
      imageView = FindViewById<ImageView>(Resource.Id.imageView1); 
      Bitmap imageBitmap = BitmapFactory.DecodeFile(imagePath); 
      imageView.SetImageBitmap(imageBitmap); 
     } 

    } 
} 

다중 플랫폼 응용 프로그램을 원하기 때문에 TimerTask를 사용하면 좋을지 모르겠습니다.

답변

2

UI 스레드에서 업데이트를 실행했는지 확인하십시오.

private void OnTimedEvent(Object source,ElapsedEventArgs e) 
{ 
    if (actualImage < imagesArray.Count-1) 
    { 
     actualImage++; 
     //imageView = FindViewById<ImageView>(Resource.Id.imageView1); 
     RunOnUiThread(() => { 
      Bitmap imageBitmap = BitmapFactory.DecodeFile((String)imagesArray[actualImage]); 
      imageView.SetImageBitmap(imageBitmap); 
     });   
     t.Start(); 
    } 
} 

참고 : 이미지로드는 항상 Android의 고통입니다. 몇 가지 이미지를 작성한 후에 OutOfMemory 예외가 발생할 수 있습니다. handle image loading yourself을 원하지 않으면 또는 UniversalImageLoader을 사용해야합니다. D

관련 문제