2016-04-14 48 views
1

我正在構建一個Android應用程序,並嘗試通過使用定時器類實現幻燈片放映。第一個圖像加載正常,然後我的應用程序崩潰。任何想法可能是什麼問題?Java定時器幻燈片

import android.app.Service; 
import android.content.Intent; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.IBinder; 
import android.service.dreams.DreamService; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.app.FragmentStatePagerAdapter; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.widget.ImageView; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.Timer; 
import java.util.TimerTask; 

public class screenSaver extends DreamService { 
    ArrayList<Bitmap> imageList = new ArrayList<Bitmap>(); 
    int slideCounter = 0; 
    ImageView slide; 
    Cursor images; 
    private int counter = 0; 
    public screenSaver() { 

    } 

    @Override 
    public void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     setInteractive(false); 
     setFullscreen(true); 
     setContentView(R.layout.screen_saver); 
     databaseHelper dbHelper = new databaseHelper(this); 
     SQLiteDatabase db = dbHelper.getReadableDatabase(); 
     images = db.rawQuery("SELECT " + databaseHelper.IMAGE + " FROM " + databaseHelper.TABLE_NAME + " where " + databaseHelper.LTO + " = 1", null); 
     images.moveToFirst(); 

     while(!images.isAfterLast()) { 
      imageList.add(BitmapFactory.decodeByteArray(images.getBlob(images.getColumnIndex(databaseHelper.IMAGE)), 0, images.getBlob(images.getColumnIndex(databaseHelper.IMAGE)).length)); 
      images.moveToNext(); 
     } 


     } 




    @Override 
    public void onDreamingStarted() { 

     slide = (ImageView) findViewById(R.id.slider); 
     class flipper extends TimerTask { 

      @Override 
      public void run() { 

       slide.setImageBitmap(imageList.get(counter)); 
       if(counter == (imageList.size())) { 
        counter = 0; 
       } else { 
        counter++; 
       } 

      } 


     } 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(new flipper(), 0, 5000); 


    } 
} 

我一直在爲此奮鬥了一段時間,所以我真的非常感謝任何指導。

非常感謝!

EDIT:錯誤

Process: midamcorp.com.burgerkingapp, PID: 2126 
                      android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
                       at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6556) 
                       at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:942) 
                       at android.view.ViewGroup.invalidateChild(ViewGroup.java:5081) 
                       at android.view.View.invalidateInternal(View.java:12713) 
                       at android.view.View.invalidate(View.java:12677) 
                       at android.view.View.invalidate(View.java:12661) 
                       at android.widget.ImageView.invalidateDrawable(ImageView.java:246) 
                       at android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:385) 
                       at android.graphics.drawable.Drawable.setBounds(Drawable.java:165) 
                       at android.widget.ImageView.configureBounds(ImageView.java:1116) 
                       at android.widget.ImageView.updateDrawable(ImageView.java:898) 
                       at android.widget.ImageView.setImageDrawable(ImageView.java:472) 
                       at android.widget.ImageView.setImageBitmap(ImageView.java:605) 
                       at midamcorp.com.burgerkingapp.MainActivity$1flipper.run(MainActivity.java:48) 
                       at java.util.Timer$TimerImpl.run(Timer.java:284) 
+0

郵政的logcat消息請。 –

+0

不幸的是,這是我的主要障礙之一。由於這是一項服務而不是一項活動,所以我無法弄清楚如何在模擬器上進行測試,並且我沒有設備進行調試(我找不到適用於我的平板電腦的adb網橋)。 – KellyMarchewa

+0

你試試這個:http://stackoverflow.com/questions/4008081/debugging-a-service –

回答

5

從調試消息,所述錯誤是由線程,因爲它不與用戶界面中的同一個線程引起的。

slide.setImageBitmap(imageList.get(counter)); 

可能的解決方案是使用HandlerrunOnUIThread

+3

您將需要使用'Handler.postDelayed'來考慮延遲。我不確定'runOnUIThread'支持延遲。 您可以從Runnable再次調用'postDelayed'來定期調用您的代碼。 – mbonnin

+0

非常感謝你們!我目前無法測試代碼,但僅僅是爲了讓我得到一般的想法,就像這樣工作:handler = new Handler(Looper.getMainLooper()); handler.postDelayed(鰭狀肢,5000)?再次感謝! – KellyMarchewa