2012-05-28 2 views
2

Я использую андроид ViewPager: http://developer.android.com/reference/android/support/v4/view/ViewPager.htmlAndroid Фрагменты и отдельные темы

Этот класс позволяет в основном пощечину кучу Фототуры или фрагментов в группе и листать их легко. Моя проблема возникает, когда я пытаюсь создать отдельный поток для случайного перетасовки через представления.

Я продлил нить, которая назовет setCurrentItem на моем ViewPager, через который я прошел через аргумент. Когда я сделал, что я получил это:

java.lang.IllegalStateException: Must be called from main thread of process 

я понял все, что я должен был бы сделать, чтобы исправить это было бы вызвать метод из моего activityfragment поэтому я создал changePageFromActivity делать грязную работу и называется, что, передавая мой активность в моей теме. Но это тоже не сработало. Ниже приводятся полные трассировки стеки:

FATAL EXCEPTION: Thread-11 
java.lang.IllegalStateException: Must be called from main thread of process 
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1392) 
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431) 
at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:160) 
at android.support.v4.view.ViewPager.populate(ViewPager.java:804) 
at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:433) 
at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:405) 
at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:397) 
at com.lyansoft.music_visualizer.MusicVisualizerActivity.changePageFromActivity(MusicVisualizerActivity.java:144) 
at com.lyansoft.music_visualizer.ShuffleThread.run(ShuffleThread.java:38) 

После выполнения некоторых исследований я понял, что фрагменты легко разрушаются и приводят в другом потоке так, чтобы предотвратить любые проблемы ViewPager только убедился, что метод, который я хотел был быть вызван из основной вид деятельности.

Так что мой вопрос:

Можно ли внедрить что-то вдоль линий

run() { while(condition) { methodIWantHere(); sleep(timeout); } } 

внутри нити моего основного вида деятельности без нарушения его?

ИЛИ

Что такое лучший шаблон дизайна для достижения эффекта я хотел бы? (который должен изменить вид с согласованными интервалами)

ответ

8

A Handler будет очевидным выбором.

final Runnable changeView = new Runnable() 
{ 
    public void run() 
    { 
     methodIWantHere(); 
     handler.postDelayed(this, timeout); 
    } 
}; 

handler.postDelayed(changeView, timeout); 
+0

Это именно то, что я искал! Спасибо! – ebolyen

3

Попробуйте выполнить свой кусок кода с помощью

runOnUiThread(Runnable action). 
+0

Спасибо, не знаю, как я это пропустил. :) – ebolyen

Смежные вопросы