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

标签 java android ssh bundle state

我有一些支持 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/

相关文章:

java - 读取 anchor JSoup 中的数据

java - HashMap + Lambda。如果为空,如何添加新值 <List>

java - SSH Android Studio 连接到 RaspberryPi,未知问题

ruby - Capistrano、防火墙和隧道

python - SSH连接成功后执行命令

git - 如何生成 ssh key (对于 github)

Java 十六进制

java - 在AWS EC2上的springboot中从.env文件访问环境变量

java - Proguard 是否删除未使用的代码(在 Android 上)

java - 使用 Iterable 的类的多个迭代器