0

简要说明我在做什么:我FragmentActivity通过 a 托管 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 都有一个相当复杂的布局,其中包含很多TextViews. 当FragmentActivity用户单击上一个ListItem中的a 时开始Activity,并且在开始之前有大约 0.5-1 秒的延迟FragmentActivity。我的考虑是延迟是由初始化和设置大量 引起的TextViews,所以我尝试在一个中做所有这些事情AsyncTask

    @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和 inflated传递ViewAsyncTask它的构造函数,然后初始化并将它们设置在一个循环中。

Fragments当我在带有异常的应用程序崩溃之间滑动时,它有时会起作用(例如十分之 1) :

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

我知道这Exception意味着什么,但问题是:为什么它会意外发生?

第二个问题:我猜在后台初始化和设置Views不是要走的路。那么我怎样才能避免延迟Activity's开始呢?

4

2 回答 2

1

使用 AsyncTask.onProgressUpdate 方法在 UI 线程上安全地更新 UI。这是一个粗略的大纲:

new AsyncTask<Void, Object, Void>() {

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

    @Override
    protected void onProgressUpdate(Object... values) {
        String label = (String) values[0];
        int viewId = (Integer) values[1];
        TextView tv = (TextView) v.findViewById(viewId);
        tv.setText(label);
    }

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

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


        }
        return null;
    }
}.execute();
于 2013-09-06T00:14:56.667 回答
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 回答