0

ViewPagerIndicator によって膨張したレイアウトと runnable 内のプロセスに問題があります。常にそうであるとは限りませんが、すでに数回発生しています。

MainActivity.java

protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mAdapter = new GtAdapter(getSupportFragmentManager());
        mPager = (ViewPager)findViewById(R.id.pager);
        mPager.setOffscreenPageLimit(5);
        mPager.setAdapter(mAdapter);
        mIndicator = (TabPageIndicator)findViewById(R.id.indicator);
        mIndicator.setViewPager(mPager);
        mIndicator.setCurrentItem(1);
        mIndicator.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {   
            public void onPageSelected(int position) {
            }
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }
            public void onPageScrollStateChanged(int state) {
            }
        });
        int cod = mAdapter.getItemPosition(0);

        refreshPages();

    }   

refreshPages() メソッドには、ViewPagerIndicator によって膨張したビューへの参照を作成する Runnable がありますが、これは通常は機能しますが、時々 (〜 20 個の動作 - 1 エラー) その参照で NullPointerException エラーが発生します。

コードにいくつかのログ タグを付けたところ、エラーが発生したときに、inflate プロセスが開始される前に refreshPages メソッドが発生したことがわかりました。なぜこれが起こるのですか?インフレート プロセスが完了した後にのみ、refreshPages メソッドを開始するにはどうすればよいですか? ありがとう

4

1 に答える 1

0

@ダニエル、

refreshPages には Runnable があるか実装されているため、そのコードは別のスレッドで実行されます。スレッドがいつ実行されるかを制御することはできません。それだけです。これが、コードが機能しない場合がある理由です。簡単な方法の 1 つは、(スレッド間で) 共有フラグを使用してスレッドを同期するか、セマフォを使用してより適切な方法で同期することです。とりあえず、同期方法が理解できるまで、フラグを使って実験してみてください。理解?

前に提案したように、refreshPages() のコードをレビュー用に提供することができます。

于 2012-06-11T19:59:41.770 に答える