Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android-保存/恢复自定义类的状态_Java_Android_Ssh_Bundle_State - Fatal编程技术网

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

Java Android-保存/恢复自定义类的状态,java,android,ssh,bundle,state,Java,Android,Ssh,Bundle,State,我有一些ssh支持类——它在内部使用jsch。我在主要活动中使用本课程,方法如下: public class MainActivity extends Activity { SshSupport ssh = new SshSupport(); ..... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

我有一些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();
            }

        }
    });

}
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
添加,则最安全。尽管操作小心,但您可以将此行为添加到现有的动态片段中


您可以在。

中阅读更多关于这方面的信息,所以如果我正确理解文档示例的话。我应该将创建的ssh对象推送到上面示例中的setData吗?好的,但是如何处理我的事件呢?在我将对象放入片段之前,我应该只分配一次事件吗?我指的是事件overrides@user1209216:“我应该在上面的示例中将创建的ssh对象推送到setData吗?”--您应该在片段的数据成员中保留“创建的ssh对象”。是否使用getter和setter取决于您。“在我将对象放入片段之前,我应该只分配一次事件吗?”--大概是这样。@user1209216:从在整个配置更改中保持连接的角度来看,这应该是可行的。就我个人而言,我只是将所有SSH相关的逻辑移到片段中,以实现更好的代码封装。