7

私はアンドロイド ViewPager を使用しています: http://developer.android.com/reference/android/support/v4/view/ViewPager.html

このクラスを使用すると、基本的に一連のビューまたはフラグメントをグループに平手打ちし、それらを簡単にページングできます。ビューをランダムにシャッフルする別のスレッドを作成しようとすると、問題が発生します。

引数を介して渡した ViewPager でsetCurrentItemを呼び出すスレッドを拡張しました。私がそれをしたとき、私はこれを受け取りました:

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); } }

メイン アクティビティのスレッド内で中断せずに?

また

私が望む効果を達成するためのより良いデザインパターンは何ですか? (これは、一貫した指定された間隔でビューを変更することです)

4

2 に答える 2

14

AHandlerは当然の選択です。

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

handler.postDelayed(changeView, timeout);
于 2012-05-28T06:32:31.790 に答える
11

を使用してコードを実行してみてください

runOnUiThread(Runnable action). 
于 2012-05-28T06:37:12.130 に答える