0

私がやっていることの簡単な説明: 私のFragmentActivityホストは を介し​​て 4 つのフラグメントでありViewPager、それらは を拡張する私のクラスで作成されますFragment

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = null;
    switch (mPage) {

    case 1:

        view = inflater.inflate(R.layout.frag1,
                container, false);
        initFrag1(view);
        break;

    // ....... and so on

    }

    return view;
}

メソッドではonCreateView()、ページ (フラグメント) に応じてデータを初期化します。各 Fragment には、 LOT OF を持つ非常に複雑な Layout がありTextViewsます。ユーザーが前の をFragmentActivityクリックすると開始され、開始までに約 0.5 ~ 1 秒の遅延があります。私の考えでは、遅延は大量の を初期化して設定することによって引き起こされるので、次のようにすべてを実行しようとしました。ListItemActivityFragmentActivityTextViewsAsyncTask

    @Override
protected Void doInBackground(Void... params) {

    DecimalFormat df = new DecimalFormat("#0.00");

    for (int i = 0; i < FirstTextViewArray.length; i++) {
        tmp = (TextView) v.findViewById(FirstTextViewArray[i]);
        tmp.setText("test " + String.valueOf(i));
    }
    for (int i = 0; i < SecondTextViewArray.length; i++) {
        tmp = (TextView) v.findViewById(SecondTextViewArray[i]);
        tmp.setText(df.format((SomeClass
                .getSomeFloatArray(Constants.tmpObject.getSomeInt())[i]));


    }
    return null;

}

したがって、基本的にはTextViewsasArraysと inflatedViewAsyncTaskコンストラクターに渡し、初期化してループ内に設定するだけです。

Fragmentsそれは動作しますが、例外でアプリがクラッシュする間をスワイプすると(10分の1のように)時々動作します:

CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views

それが何をException意味するかはわかりますが、問題は、なぜそれが偶発的に発生するのかということです。

Views2 番目の質問: init とバックグラウンドでの設定は適切ではないと思います。どうすればActivity's開始時の遅延を回避できますか?

4

2 に答える 2

0

メインスレッドのみがビューを操作できるため、このエラーが発生します。このスレッドを使用する必要があります:

getActivity().runOnUiThread(new Runnable() {
     public void run() {
          //stuff that updates your views
          DecimalFormat df = new DecimalFormat("#0.00");

          for (int i = 0; i < FirstTextViewArray.length; i++) {
              tmp = (TextView) v.findViewById(FirstTextViewArray[i]);
              tmp.setText("test " + String.valueOf(i));
          }
          for (int i = 0; i < SecondTextViewArray.length; i++) {
              tmp = (TextView) v.findViewById(SecondTextViewArray[i]);
              tmp.setText(df.format((SomeClass.getSomeFloatArray(Constants.tmpObject.getSomeInt())[i]));

          }
    }
});

そう

于 2013-09-05T23:03:23.827 に答える