我遇到使用FragmentManager替换片段的问题。我的问题是冻结用户界面。我正在努力寻找一些好的做法和/或库来解决我的问题。
我的部分代码:
主要活动布局:
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/my_drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<FrameLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v4.widget.DrawerLayout>
主要活动类
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();
}
我的每个片段都像
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);
//many long time data downloading & creating view
}
private void nextFragment() {
((MyActivity) getActivity()).nextFragment(
new SomeNextFragment(), 0);
}
}
现在因为在每个片段上下载数据,我的UI开始冻结。提前感谢您的帮助。
答案 0 :(得分:2)
通常,您不应该在UI线程上执行长时间运行/阻塞操作。使用工作线程或AsyncTask
。
通常,我建议您在onCreateView
中创建任何内容,然后在后台操作完成后设置值。例如,立即创建TextView,然后从后台操作获得结果,然后在现有的TextView中设置文本。
使用线程:
final Handler handler = new Handler();
new Thread(new Runnable(){
@Override
public void run(){
//long running code
//this is running on a background thread
final String someText = //result of long running code
handler.post(new Runnable(){
@Override
public void run(){
//since the handler was created on the UI thread,
// this code will run on the UI thread
someTextView.setText(someText);
}
});
}
}).start();
您也可以使用getActivity().runOnUiThread(new Runnable(){...});
代替Handler