Folgendes Szenario: Ich habe ein TabLayout mit 2 Registerkarten. Auf der einen Registerkarte befindet sich ein Button. Wenn ich diesen Button drücke, stellt die App eine Verbindung zu einem Chat-Server her und wechselt automatisch zur zweiten Registerkarte. Das Problem ist, dass die App abstürzt, wenn ich zur ersten Registerkarte zurückkehre (während die Verbindung zum Server noch besteht). Wenn ich zwischen den Registerkarten wechsle (solange keine Verbindung zum Server hergestellt wurde), ist alles normal und die App stürzt überhaupt nicht ab.
Der vollständige Fehler (der wichtigste Teil habe ich hervorgehoben) lautet:
Hier der Code von MainActivity.java (wurde gekürzt):
Wie ihr sehen könnt, wechselt die App bei der Methode 'connect' (die ausgeführt wird, wenn der Button von Tab 1 gedrückt wird) automatisch von Tab 1 zu Tab 2. Daher vermute ich, dass ein gewisser Status gemeldet werden muss. Zum Beispiel muss ich möglicherweise melden, dass Registerkarte 1 nicht mehr ausgewählt ist.
Hat jemand eine Idee, woran das Problem liegen könnte?
LG
Ach ja: ich habe versucht, dass die ganze Transaction nicht asynchronisch läuft, durch die Methode bei der ich euch vorhin gefragt habe, warum sie nicht zu FragmentTransaction gehöre (siehe mein letztes Thema). Aber es hat nichts gebracht
Der vollständige Fehler (der wichtigste Teil habe ich hervorgehoben) lautet:
12-21 15:04:19.693 11342 11342 E AndroidRuntime FATAL EXCEPTION: main
12-21 15:04:19.693 11342 11342 E AndroidRuntime Process: com.mycompany.myapp, PID: 11342
12-21 15:04:19.693 11342 11342 E AndroidRuntime java.lang.IllegalStateException: No host
12-21 15:04:19.693 11342 11342 E AndroidRuntime at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1235)
12-21 15:04:19.693 11342 11342 E AndroidRuntime at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1230)
12-21 15:04:19.693 11342 11342 E AndroidRuntime at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:2042)
12-21 15:04:19.693 11342 11342 E AndroidRuntime at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1976)
12-21 15:04:19.693 11342 11342 E AndroidRuntime at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1092)
12-21 15:04:19.693 11342 11342 E AndroidRuntime at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)
12-21 15:04:19.693 11342 11342 E AndroidRuntime at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
12-21 15:04:19.693 11342 11342 E AndroidRuntime at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)
12-21 15:04:19.693 11342 11342 E AndroidRuntime at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)
12-21 15:04:19.693 11342 11342 E AndroidRuntime at android.os.Handler.handleCallback(Handler.java:790)
12-21 15:04:19.693 11342 11342 E AndroidRuntime at android.os.Handler.dispatchMessage(Handler.java:99)
12-21 15:04:19.693 11342 11342 E AndroidRuntime at android.os.Looper.loop(Looper.java:165)
12-21 15:04:19.693 11342 11342 E AndroidRuntime at android.app.ActivityThread.main(ActivityThread.java:6774)
12-21 15:04:19.693 11342 11342 E AndroidRuntime at java.lang.reflect.Method.invoke(Native Method)
12-21 15:04:19.693 11342 11342 E AndroidRuntime at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:477)
12-21 15:04:19.693 11342 11342 E AndroidRuntime at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:809)
Hier der Code von MainActivity.java (wurde gekürzt):
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 connect(String nombre, String ip, int puerto) { //Diese Methode wird aufgerufen, wenn der Button aus Tab 1 getätigt wird
//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..."));
}
}
});
}
}
Wie ihr sehen könnt, wechselt die App bei der Methode 'connect' (die ausgeführt wird, wenn der Button von Tab 1 gedrückt wird) automatisch von Tab 1 zu Tab 2. Daher vermute ich, dass ein gewisser Status gemeldet werden muss. Zum Beispiel muss ich möglicherweise melden, dass Registerkarte 1 nicht mehr ausgewählt ist.
Hat jemand eine Idee, woran das Problem liegen könnte?
LG
Ach ja: ich habe versucht, dass die ganze Transaction nicht asynchronisch läuft, durch die Methode bei der ich euch vorhin gefragt habe, warum sie nicht zu FragmentTransaction gehöre (siehe mein letztes Thema). Aber es hat nichts gebracht
Zuletzt bearbeitet: