在片段事务时冻结用户界面。
在片段事务时冻结用户界面。
我在使用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现在,因为在每个片段开始时下载数据,我的界面会卡顿。提前感谢任何帮助。
当在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`。