2016-04-14 73 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