![](/img/trans.png)
[英]Android - Save/restore state with FragmentStatePageAdapter
[英]Android - save/restore state of custom class
我有一些支持ssh的类-它在内部使用jsch。 我通过以下方式在主要活动上使用此类:
public class MainActivity extends Activity
{
SshSupport ssh = new SshSupport();
.....
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//Handle events for ssh
ssh.eventHandler = new ISshEvents()
{
@Override
public void SshCommandExecuted(SshCommandsEnum commandType, String result)
{
}
//other overrides here
}
//Ssh operations on gui item click
@Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3)
{
if (ssh.IsConnected() == false)
{
try
{
ssh.ConnectAsync(/*parameters*/);
}
catch (Exception e)
{
e.printStackTrace();
}
}
try
{
ssh.ExecuteCommandAsync(SshCommandsEnum.values()[position]);
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
}
效果很好。 我的应用程序连接到ssh,在后台线程中执行所有所需的操作,并通过事件将结果报告给gui,如上所示。 但是,用户更改设备方向后无任何作用。 对我来说很明显-重新创建了活动,所有状态都丢失了。 不幸的是,我的SshSupport类对象也丢失了。
为动态更改/添加的对象存储gui状态非常容易(使用put / get serializable等方法)。 但是我不知道如何防止我的ssh对象,ssh连接的会话丢失。
由于我的课程无法序列化,因此无法将其保存到捆绑包中。 同样,即使我将SshSupport类设置为可序列化的,它使用的jsch对象仍然无法序列化。
那么解决此问题的最佳方法是什么? 另外,我需要执行一些后台操作(在SshSupport类中使用AsyncTask)。 并将进度报告给MainActivity。 但是,再次,我的线程将在设备方向更改时被破坏。
[添加]关于您的解决方案,我创建了保留的片段并通过以下方式进行处理:
public class MainActivity extends Activity
{
SshSupport ssh;
private RetainedFragment dataFragment;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// find the retained fragment on activity restarts
FragmentManager fm = getFragmentManager();
dataFragment = (RetainedFragment) fm.findFragmentByTag("data");
// create the fragment and data the first time
if (dataFragment == null)
{
ssh = new SshSupport();
// add the fragment
dataFragment = new RetainedFragment();
fm.beginTransaction().add(dataFragment, "data").commit();
// load the data from the web
dataFragment.setData(ssh);
}
ssh = dataFragment.getData();
ssh.eventHandler = new ISshEvents()
{
.......
}
}
@Override
public void onDestroy()
{
super.onDestroy();
// store the data in the fragment
dataFragment.setData(ssh);
}
}
这个对吗? 它似乎应该工作。
那么解决此问题的最佳方法是什么?
使用保留的片段来管理您的SSH连接。 所谓“保留片段”,是指您已在其上调用setRetainInstance(true)
片段。 该片段不会在配置更改时被销毁并重新创建。 取而代之的是,它将被“保留”并直接移交给新的活动实例,因此保留的任何内容都将类似地保留。
如果此片段是不带UI的FragmentTransaction
,则是最安全的,它是通过FragmentTransaction
添加的,尽管经过了仔细的操作,但是您可以将此行为添加到现有的动态片段中。
您可以在在线文档中阅读有关此内容的更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.