您的位置:首页 > 移动开发 > Android开发

android 四大组件Acitivity (2) 保存activity状态 Fragment

2016-07-07 12:18 591 查看
android 四大组件Acitivity (2) 保存activity状态 Fragment

(1) 继承Fragment ,

    设置 setRetainInstance(true); 不会被重建, 不会销毁在Activiy销毁的时候

    保证了Fragment 可以保存数据

package my;

import android.app.Fragment;
import android.os.Bundle;

public class DataFragment extends Fragment {
private MyTask myTask;

public void setData(MyTask myTask){
this.myTask = myTask;
}
public MyTask getData(){
return myTask;
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);//onCreate 不会调用,在fragment重建 和onDestroy() 不会创建
      //
}
}


使用DialogFragment 创建一个加载进度显示条(官方推荐)

package my;

import com.example.zhy_handle_runtime_change.R;
import com.example.zhy_handle_runtime_change.R.id;
import com.example.zhy_handle_runtime_change.R.layout;
import com.example.zhy_handle_runtime_change.R.style;

import android.app.Dialog;
import android.app.DialogFragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;

public class LoadingDialog extends DialogFragment
{

private String mMsg = "Loading";

public void setMsg(String msg)
{
this.mMsg = msg;
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
LayoutInflater inflater = getActivity().getLayoutInflater();
View view = inflater.inflate(R.layout.dialog_loading, null);
TextView title = (TextView) view
.findViewById(R.id.id_dialog_loading_msg);
title.setText(mMsg);
Dialog dialog = new Dialog(getActivity(), R.style.dialog);
dialog.setContentView(view);
return dialog;
}
}


异步任务加载数据,同时监视Activity的状态变化

  SetActvity(Activity);

 当系统的配置发生变化的时候, 导致Activiy 被销毁,

我们根据Activity 的状态,以及Task的进度, 判断

当Activity重建时任务是否继续任务

(1)通过FragmentManager 获取保存的DataFragment

  dataFragment =   fm.getFindFragmentByTag("tag"); 这个tag是一个唯一标示

  如果DataFragment == null , 则是 Activity 第一次创建

  否则是Activity重建,

  获取MyTask

    myTask = dataFragment.getData();

  通过判断myTask是否为空, 来判断是是是重建

   myTask == null 是还未存myTask

   所以进行MyTask的初始化

      myTask = new MyTask(this);

      dataFragment.setdata(myTask); //将myTask 保存到Fragment中

      myTask.execute(); 执行

FragmentManager fm = getFragmentManager();
dataFragment = (DataFragment) fm.findFragmentByTag("datas");
if(dataFragment == null){
dataFragment = new DataFragment();
fm.beginTransaction().add(dataFragment, "datas").commit();
}


(3)重要的是每次在Activity状态改变前,将Activity保存到MyTask中

销毁前, 将Activity的状态将变为null

@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
myTask.setActivity(null);
}


在Actiivty重建获取第一次创建时, 所以要注意三个Activity变化的阶段

第一次 重建Activity

销毁Acitivity = null//容易被略了, setSaveInstanceState()

重建Acitivity

    myTask = dataFragment.getData();
if(myTask == null) {//第一次创建
myTask = new MyTask(this);
dataFragment.setData(myTask);
myTask.execute();
}else {//重建
myTask.setActivity(this);
}


package my;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import android.os.AsyncTask;

public class MyTask extends AsyncTask<Void, Void, Void> {
private LoadingDialog dialog;
private MyListActivity activity;
private List<String> datas;
private boolean isComplete;

public MyTask(MyListActivity activity){
this.activity = activity;
}

@Override
protected void onPreExecute() {
super.onPreExecute();
//进行显示初始化,
dialog = new LoadingDialog();
dialog.show(activity.getFragmentManager(), "dialog");
}

@Override
protected Void doInBackground(Void... params) {
datas = loadingData();
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
isComplete = true;
notityActivityCompleted();
if(dialog != null){
dialog.dismiss();
}
}

private void notityActivityCompleted() {
if(isComplete) {
activity.onComplete(datas);//将这个加载的数据串出去
}
}

public void setActivity(MyListActivity activity) {
if(activity == null){//activity被销毁, 在onSaveInstanceState()中设置null
if(dialog != null){
dialog.dismiss();
}
}

//设置当前的Activity
this.activity = activity;
if(activity != null & !isComplete){//数据还未加载
//进行显示初始化,重新进行dialog 的显示
dialog = new LoadingDialog();
dialog.show(activity.getFragmentManager(), "dialog");
}
if (isComplete) {//
notityActivityCompleted();
}

}

/**
* 加载数据
* @return
*/
private List<String> loadingData(){
try{
Thread.sleep(5000);
} catch (InterruptedException e){
e.printStackTrace();
}
return new ArrayList<String>(Arrays.asList("通过Fragment保存大量数据",
"onSaveInstanceState保存数据",
"getLastNonConfigurationInstance已经被弃用", "RabbitMQ", "Hadoop",
"Spark"));
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: