Android 使用异步任务时在轮换时保存片段

Android 使用异步任务时在轮换时保存片段,android,android-fragments,fragment,screen-rotation,Android,Android Fragments,Fragment,Screen Rotation,问题大致总结了一下,我正在尝试保存我的片段,因此当我旋转屏幕时,应用程序不会崩溃,但我不确定在何处或如何保存我的片段,我尝试使用片段管理器,将retaintate设置为true,并检查保存的实例状态 这是我的代码: EventsActivity—承载片段 @Override public void onCreate(Bundle savedInstanceState) { new AsyncLogin().execute(username, password); super.o

问题大致总结了一下,我正在尝试保存我的片段,因此当我旋转屏幕时,应用程序不会崩溃,但我不确定在何处或如何保存我的片段,我尝试使用片段管理器,将retaintate设置为true,并检查保存的实例状态

这是我的代码: EventsActivity—承载片段

@Override
public void onCreate(Bundle savedInstanceState) {
    new AsyncLogin().execute(username, password);

    super.onCreate(savedInstanceState);

    username = getIntent().getStringExtra("username");
    password = getIntent().getStringExtra("password");
}

private List<Fragment> getFragments(){
    List<Fragment> fList = new ArrayList<Fragment>();

    EventListFragment eventListFragment = (EventListFragment)
         EventListFragment.instantiate(this, EventListFragment.class.getName());
    EventGridFragment eventGridFragment = (EventGridFragment) 
         EventGridFragment.instantiate(this, EventGridFragment.class.getName());

    fList.add(eventListFragment);
    fList.add(eventGridFragment);

    return fList;
}
片段1:OnCreateView

 @Override
 public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    eventObjects = ((EventsActivity)getActivity()).getEventObjects();

    setRetainInstance(true);

    View view = inflater.inflate(R.layout.eventlist ,container,false);

    final ListView listView = (ListView) view.findViewById(R.id.listView);
    listView.setAdapter(new MyCustomBaseAdapter(getActivity(), eventObjects));
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> a, View v, int position, long id) {
            Object o = listView.getItemAtPosition(position);
            EventObject fullObject = (EventObject)o;
            System.out.println("asd");
        }
    });
    return view;
}
}

您应该理解,保留片段不会阻止活动被分发

现在看看这里:

@Override
public void onCreate(Bundle savedInstanceState) {
     new AsyncLogin().execute(username, password);
     // ..... 
}
当屏幕方向发生变化时,您的活动仍会被破坏。因此,将启动一个新的异步任务。但是,当旧的AsyncTask完成作业时,它会尝试将结果传递给已经销毁的旧活动。因此,这将导致崩溃

解决方案是将AsyncTask放在片段本身中。这样实例就不会在方向更改时被破坏


看看是否可以帮助您。

实际上,
碎片活动将自动在
onCreate()中恢复您的碎片

奇怪的是,首先调用
AsyncTask
,然后调用
super.onCreate()
并从
Intent
检索用户名和密码

即使将其放在一边,这种方法也会使您的活动在每次轮换时产生一个新的登录任务

更好的方法是检查
savedInstanceState
是否为
null

if (savedInstanceState == null) {
    // first launch
    new AsyncLogin().execute(username, password);
}
...
这样,它只会在第一次创建
Activity
时运行


其次,您需要完全解除登录信息与活动的绑定。使
AsyncTask
返回您在
应用程序中得到的任何登录结果,并将其存储在那里。以及从
应用程序
检索信息的活动和片段-这样您就可以完全控制登录过程:检查是否有活动会话,如果没有,则检查
异步任务
是否已在运行,如果没有,则需要启动它。如果是-您需要等待它完成(显示进度条或其他内容)。

如何让它将信息返回到应用程序使用应用程序类中的
this
静态引用,单例样式:
公共静态类MyApplication Extendes application{public static MyApplication instance;public void onCreate(){MyApplication.instance=this}…}
,然后通过引用从asynctask的
onPostExecute()
获取应用程序,类似于:
MyApplication.instance.setLoggedIn(true);
活动中,如果(!MyApplication.instance.isLoggedIn()&&&&!MyApplication.instance.isLoginTaskRunning()),您将执行
{new AsyncLogin().execute(用户名、密码);}
您可以使用service@RogerGarzonNieto你能解释一下你的意思吗
@Override
public void onCreate(Bundle savedInstanceState) {
     new AsyncLogin().execute(username, password);
     // ..... 
}
if (savedInstanceState == null) {
    // first launch
    new AsyncLogin().execute(username, password);
}
...