在片段事务时冻结用户界面。

14 浏览
0 Comments

在片段事务时冻结用户界面。

我在使用FragmentManager替换Fragment时遇到了问题。我的问题是界面卡顿。我正在尝试寻找一些好的实践和/或库来解决我的问题。\n部分代码如下:\n主活动布局:\n




\n主活动类:\n

public class MyActivity extends Activity {
    public void nextFragment(Fragment fragment, int position) {
        fragment.setArguments(new Bundle());
        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager
            .beginTransaction()
            .replace(R.id.content, fragment).commit();
    }
}

\n每个片段的代码如下:\n

import android.app.Fragment;
public class SomeFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        RelativeLayout rootView = (RelativeLayout) inflater.inflate(
            R.layout.fragment_layout, container, false);
        //很多长时间的数据下载和视图创建
    }
    private void nextFragment() {
        ((MyActivity) getActivity()).nextFragment(
            new SomeNextFragment(), 0);
    }
}

\n现在,因为在每个片段开始时下载数据,我的界面会卡顿。提前感谢任何帮助。

0
0 Comments

当在UI线程上执行长时间运行或阻塞操作时,会导致UI冻结。解决方法是使用工作线程或AsyncTask来执行这些操作。通常建议在onCreateView方法中创建必要的UI元素,然后在后台操作完成后设置值。例如,在创建TextView后,当从后台操作获取结果时,再设置已存在的TextView的文本。

以下是使用线程的示例代码:

final Handler handler = new Handler();
new Thread(new Runnable(){
    public void run(){
       // 长时间运行的代码
       // 这部分代码在后台线程上运行
       final String someText = // 长时间运行代码的结果
       handler.post(new Runnable(){
           public void run(){
               // 由于handler是在UI线程上创建的,
               //   所以这部分代码将在UI线程上运行
               someTextView.setText(someText);
           }
       });
    }
}).start();

你也可以使用`getActivity().runOnUiThread(new Runnable(){...});`来代替使用`Handler`。

0