1、问题引入
在Fragment中执行一段耗时任务,在任务未结束的时候,重建Activity就会导致getActivity()
为null
,所有用到getActivity()
的地方都会引起空指针异常,如果使用了getResources()
方法,就会导致Fragment not attached to Activity
。
为了重现这一异常,我们编写如下代码:
- FirstFragment.java
public class FirstFragment extends Fragment implements View.OnClickListener {
private TextView tvMsg;
private Button btnStartTask, btnRecreate;
private static final String TAG = "FirstFragment";
public FirstFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_first, container, false);
tvMsg = (TextView) view.findViewById(R.id.tvMsg);
btnStartTask = (Button) view.findViewById(R.id.btnStartTask);
btnRecreate = (Button) view.findViewById(R.id.btnRecreate);
btnStartTask.setOnClickListener(this);
btnRecreate.setOnClickListener(this);
return view;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnStartTask:
// 模拟一个耗时任务
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
Log.d(TAG, "getActivity = " + getActivity());
tvMsg.setText(getResources().getString(R.string.app_name));
}
}.execute();
break;
case R.id.btnRecreate:
// 重新创建MainActivity
getActivity().recreate();
break