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



以下场景:我有一个带有两个选项卡的TabLayout。在一个选项卡上有一个按钮。当我按下这个按钮时,应用程序会连接到聊天服务器,并自动切换到第二个选项卡。问题是,当我回到第一个选项卡时(当与服务器的连接仍在运行时(,应用程序会崩溃。如果我在选项卡之间切换(只要没有建立到服务器的连接(,那么一切都很正常,应用程序根本不会崩溃。应用程序抛出异常:";java.lang.IollegalStateException:没有主机"。

这里是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..."));
}
}
});
}


}

正如你所看到的,在按下选项卡1的按钮时执行的方法"conectar"中,应用程序会自动从选项卡1切换到选项卡2。因此,我怀疑必须报告一些状况。例如,我可能需要报告不再选择选项卡1。

有人知道可能是什么问题吗?

我认为问题是,当您使用replace更改片段时,它会破坏您之前添加到容器中的所有其他片段。当你按下后退按钮时,就没有碎片可以返回。我有两个建议给你:

1-使用视图寻呼机而不是使用片段管理器(如果设计允许(

2-在片段管理器中使用add而不是replace

最新更新