gpt4 book ai didi

java - Android - 保存/恢复自定义类的状态

转载 作者:行者123 更新时间:2023-12-02 05:47:33 25 4
gpt4 key购买 nike

我有一些支持 ssh 的类 - 它在内部使用 jsch。我在主要 Activity 中使用此类:

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,如上所示。但用户更改设备方向后没有任何效果。对我来说很清楚 - Activity 被重新创建,所有状态都丢失了。不幸的是,我的 SshSupport 类对象也丢失了。

存储动态更改/添加对象的 GUI 状态非常容易(使用 put/get 可序列化等方法)。但我不知道如何防止我的 ssh 对象、ssh 连接 session 丢失。

由于我的类不可序列化,因此我无法将其保存到 bundle 中。另外,即使我使 SshSupport 类可序列化,它使用的 jsch 对象仍然不可序列化。

那么解决这个问题的最佳方法是什么?另外,我需要执行一些后台操作(在我的 SshSupport 类中使用 AsyncTask)。并将进度报告给MainActivity。但同样,我的线程将在设备方向改变时被破坏。

[已添加]关于您的解决方案,我创建了保留 fragment 并以这种方式处理它:

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);
}
}

这是正确的吗?看起来应该可以正常工作。

最佳答案

So what is the best way to solve this?

使用保留的 fragment 来管理您的 SSH 连接。我所说的“保留 fragment ”是指您调用了 setRetainInstance(true) 的 fragment 。该 fragment 不会在配置更改时被销毁和重新创建。相反,它将被“保留”并直接传递给新的 Activity 实例,因此它所保留的任何内容都会被类似地保留。

如果此 fragment 是没有 UI 的 fragment ,通过 FragmentTransaction 添加,那么这是最安全的,尽管小心翼翼地完成,您可以将此行为添加到现有的动态 fragment 中。

您可以在the online documentation中阅读更多相关信息。 .

关于java - Android - 保存/恢复自定义类的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23899144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com