![](/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.