如何解决java.lang.illegalstateexception:没有主机?

gorkyyrv  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(498)

下面的场景:我有一个带有两个标签的tablayout。在一个选项卡上有一个按钮。当我按下那个按钮时,应用程序会连接到聊天服务器并自动切换到第二个选项卡。问题是,当我回到第一个选项卡时(当与服务器的连接仍在运行时),应用程序崩溃。如果我在选项卡之间切换(只要没有建立到服务器的连接),那么一切都正常,应用程序不会崩溃。应用程序抛出异常:“java.lang.illegalstateexception:no host”。
这里是mainactivity.java的(简称)代码:

public class MainActivity extends AppCompatActivity 
{
    FrameLayout simpleFrameLayout;
    TabLayout tabLayout;
    SecondFragment s = new SecondFragment();

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        simpleFrameLayout = (FrameLayout) findViewById(R.id.simpleFrameLayout);
        tabLayout = (TabLayout) findViewById(R.id.simpleTabLayout);
// Create a new Tab named "First"
        TabLayout.Tab firstTab = tabLayout.newTab();
        firstTab.setText("First"); // set the Text for the first Tab

// first tab
        tabLayout.addTab(firstTab); // add  the tab at in the TabLayout
// Create a new Tab named "Second"
        TabLayout.Tab secondTab = tabLayout.newTab();
        secondTab.setText("Second"); // set the Text for the second Tab

        tabLayout.addTab(secondTab); // add  the tab  in the TabLayout

        Fragment fragment = null;
        fragment = new FirstFragment();
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.replace(R.id.simpleFrameLayout, fragment);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        ft.commit();

        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                @Override
                public void onTabSelected(TabLayout.Tab tab) {
// get the current selected tab's position and replace the fragment accordingly
                    Fragment fragment = null;
                    switch (tab.getPosition()) {
                        case 0:
                            fragment = new FirstFragment();
                            myMenu.findItem(R.id.telefono).setVisible(false);
                            break;
                        case 1:
                            fragment = s;
                            myMenu.findItem(R.id.telefono).setVisible(true);
                            break;
                    }
                    FragmentManager fm = getSupportFragmentManager();
                    FragmentTransaction ft = fm.beginTransaction();
                    ft.replace(R.id.simpleFrameLayout, fragment);
                    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                    ft.commit();
                }
                @Override
                public void onTabUnselected(TabLayout.Tab tab) {

                }

                @Override
                public void onTabReselected(TabLayout.Tab tab) {

                }
            });
    }

    public void conectar(String nombre, String ip, int puerto) { //This method is called when the button of tab one is pressed
        //Code...
        Executor executor = Executors.newSingleThreadExecutor();
        executor.execute(new Runnable() {
                @Override
                public void run() {
                    Looper.prepare();

                    try{
                        //Code...
                        try {
                            //Code...
                            try {
                                runOnUiThread(new Runnable() {

                                        @Override
                                        public void run() {
                                            TabLayout.Tab tab = tabLayout.getTabAt(1);
                                            tab.select();
                                        }
                                    });

                            }
                            catch (Exception e){

                            }

                            //Code...
                        }
                        catch(SocketTimeoutException ex)
                        {

                        }
                    }
                    catch(Exception e){
                        StringWriter sw = new StringWriter();
                        e.printStackTrace(new PrintWriter(sw));
                        String stacktrace = sw.toString();
                        // create an email intent to send to yourself
                        final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
                        emailIntent.setType("plain/text");
                        emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { "lets.think.android@gmail.com" });
                        emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "App Error Report");
                        emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, stacktrace);
                        // start the email activity - note you need to start it with a chooser
                        startActivity(Intent.createChooser(emailIntent, "Send error report..."));
                    }
                }
            });

    }

}

如您所见,在按下tab 1的按钮时执行的方法“conectar”中,应用程序会自动从tab 1切换到tab 2。因此,我怀疑必须报告一些情况。例如,可能我需要报告选项卡1不再被选中。
有人知道问题出在哪里吗?

3b6akqbq

3b6akqbq1#

我认为问题是当你使用 replace 要更改其片段,请销毁之前添加到容器中的所有其他片段。当你按下后退按钮时,就没有碎片可以放回去了。我有两个建议给你:
1-使用视图寻呼机,而不是使用片段管理器(如果设计允许)
2-使用 add 而不是 replace 在片段管理器中

相关问题