new Thread() und setView - Stürzt ab

  • Antworten:3
  • Bentwortet
Willy F.
  • Forum-Beiträge: 6

02.05.2013, 23:17:50 via Website

Hallo,
zu erstmal: Ich bin noch Android-Neuling, habe zwar schon einige einfache Apps erstellt, bis dahin auch eigentlich ganz gut mit meinen Kenntnissen ausgekommen.
Nun zu meiner aktuellen App und Problem. Ich habe vor, mich über HTTP auf einem Server anzumelden und dort einige Dinge/Daten abzufragen. Zum Start der App gibt man die URL des Servers ein und wenn dieser über ein Passwort gesichert (.htaccess) ist, soll man wie im folgendem Code, sprich Dialog, Name und Passwort eingeben. Nachdem man die URL eingegeben hat, wird ein ProgressDialog angezeigt, welcher während des Verbindungsaufbaus angezeigt wird, erst darauf folgt folgender Code.
Damit der ProgressDialog angezeigt wird, musste ich
1new Thread() {
2 public void run() {
3 Looper.prepare();
4[...]
5 Looper.loop();
6 }
7}.start();
um den AlertDialog legen. Nun aber hat dieser ein Problem mit "builder.setView(layout);". Kommentiere ich diese Zeile aus, funktioniert alles einwandfrei, leider habe ich dann meine Eingabefelder nicht.

1new Thread() {
2 public void run() {
3 Looper.prepare();
4 getApplicationContext();
5 LayoutInflater inflater = (LayoutInflater) MainActivity.this.getSystemService (Context.LAYOUT_INFLATER_SERVICE);
6 final View layout = inflater.inflate(R.layout.dialog_signin, null);
7 final Builder builder = new AlertDialog.Builder(MainActivity.this);
8 builder.setTitle("Authentifikation");
9 builder.setMessage("Name und Passwort eingeben");
10 builder.setView(layout);
11 builder.setCancelable(false);
12 builder.setPositiveButton("Anmelden", new OnClickListener() {
13 public void onClick(DialogInterface arg0, int arg1) {
14 EditText signin_username = (EditText) layout.findViewById(R.id.signin_username);
15 EditText signin_password = (EditText) layout.findViewById(R.id.signin_password);
16 [... verarbeite signin_username und signin_password ...]
17 }
18 });
19 builder.setNegativeButton("Abbrechen", new OnClickListener() {
20 public void onClick(DialogInterface dialog, int which) {
21 dialog.cancel();
22 }
23 });
24 builder.show();
25 Looper.loop();
26 }
27}.start();

Problem: Sobald der AlertDialog geladen wird, stürzt die App ab, dies aber auch eher ungewöhnlich, weil im Emulator (Android 4.0) geht alles, an meinem Nexus 7 nicht :( Außerdem ist komisch, dass die App nur abstürtzt, wenn ich nach dem Start direkt die URL eingebe, wenn ich etwas in der App mache und dann die URL eingebe, funktioniert es - meistens.

Ich hoffe Ihr könnt mir helfen. Ich bin für jede Antwort dankbar :)

mfg Willy

EDIT (03.05.2013 15.48)

Habe mein Nexus 7 mal über USB mit Eclipse verbunden und dort die App ausgeführt. Nachfolgend ist der Errorlog.

105-03 15:45:23.497: E/AndroidRuntime(30614): FATAL EXCEPTION: Thread-41774
205-03 15:45:23.497: E/AndroidRuntime(30614): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
305-03 15:45:23.497: E/AndroidRuntime(30614): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4746)
405-03 15:45:23.497: E/AndroidRuntime(30614): at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:854)
505-03 15:45:23.497: E/AndroidRuntime(30614): at android.view.ViewGroup.invalidateChild(ViewGroup.java:4075)
605-03 15:45:23.497: E/AndroidRuntime(30614): at android.view.View.invalidate(View.java:10386)
705-03 15:45:23.497: E/AndroidRuntime(30614): at android.view.View.invalidate(View.java:10341)
805-03 15:45:23.497: E/AndroidRuntime(30614): at android.widget.TextView.updateAfterEdit(TextView.java:7253)
905-03 15:45:23.497: E/AndroidRuntime(30614): at android.widget.Editor.finishBatchEdit(Editor.java:1081)
1005-03 15:45:23.497: E/AndroidRuntime(30614): at android.widget.Editor.endBatchEdit(Editor.java:1064)
1105-03 15:45:23.497: E/AndroidRuntime(30614): at android.widget.TextView.endBatchEdit(TextView.java:5712)
1205-03 15:45:23.497: E/AndroidRuntime(30614): at com.android.internal.widget.EditableInputConnection.endBatchEdit(EditableInputConnection.java:77)
1305-03 15:45:23.497: E/AndroidRuntime(30614): at android.view.inputmethod.BaseInputConnection.finishComposingText(BaseInputConnection.java:271)
1405-03 15:45:23.497: E/AndroidRuntime(30614): at android.view.inputmethod.InputMethodManager.checkFocusNoStartInput(InputMethodManager.java:1300)
1505-03 15:45:23.497: E/AndroidRuntime(30614): at android.view.inputmethod.InputMethodManager.onWindowFocus(InputMethodManager.java:1344)
1605-03 15:45:23.497: E/AndroidRuntime(30614): at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:2934)
1705-03 15:45:23.497: E/AndroidRuntime(30614): at android.os.Handler.dispatchMessage(Handler.java:99)
1805-03 15:45:23.497: E/AndroidRuntime(30614): at android.os.Looper.loop(Looper.java:137)
1905-03 15:45:23.497: E/AndroidRuntime(30614): at de.ziix.controlcenter.MainActivity$4.run(MainActivity.java:413)
2005-03 15:45:24.317: E/WindowManager(30614): Activity de.ziix.controlcenter.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{42717b68 V.E..... R......D 0,0-640,128} that was originally added here
2105-03 15:45:24.317: E/WindowManager(30614): android.view.WindowLeaked: Activity de.ziix.controlcenter.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{42717b68 V.E..... R......D 0,0-640,128} that was originally added here
2205-03 15:45:24.317: E/WindowManager(30614): at android.view.ViewRootImpl.<init>(ViewRootImpl.java:354)
2305-03 15:45:24.317: E/WindowManager(30614): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:216)
2405-03 15:45:24.317: E/WindowManager(30614): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
2505-03 15:45:24.317: E/WindowManager(30614): at android.app.Dialog.show(Dialog.java:281)
2605-03 15:45:24.317: E/WindowManager(30614): at de.ziix.controlcenter.MainActivity.connectToIP(MainActivity.java:282)
2705-03 15:45:24.317: E/WindowManager(30614): at de.ziix.controlcenter.MainActivity$2.onClick(MainActivity.java:239)
2805-03 15:45:24.317: E/WindowManager(30614): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
2905-03 15:45:24.317: E/WindowManager(30614): at android.os.Handler.dispatchMessage(Handler.java:99)
3005-03 15:45:24.317: E/WindowManager(30614): at android.os.Looper.loop(Looper.java:137)
3105-03 15:45:24.317: E/WindowManager(30614): at android.app.ActivityThread.main(ActivityThread.java:5041)
3205-03 15:45:24.317: E/WindowManager(30614): at java.lang.reflect.Method.invokeNative(Native Method)
3305-03 15:45:24.317: E/WindowManager(30614): at java.lang.reflect.Method.invoke(Method.java:511)
3405-03 15:45:24.317: E/WindowManager(30614): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
3505-03 15:45:24.317: E/WindowManager(30614): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
3605-03 15:45:24.317: E/WindowManager(30614): at dalvik.system.NativeStart.main(Native Method)
3705-03 15:45:24.317: E/WindowManager(30614): Activity de.[...].MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{4277abd8 V.E..... R.....ID 0,0-772,426} that was originally added here
3805-03 15:45:24.317: E/WindowManager(30614): android.view.WindowLeaked: Activity de.ziix.controlcenter.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{4277abd8 V.E..... R.....ID 0,0-772,426} that was originally added here
3905-03 15:45:24.317: E/WindowManager(30614): at android.view.ViewRootImpl.<init>(ViewRootImpl.java:354)
4005-03 15:45:24.317: E/WindowManager(30614): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:216)
4105-03 15:45:24.317: E/WindowManager(30614): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
4205-03 15:45:24.317: E/WindowManager(30614): at android.app.Dialog.show(Dialog.java:281)
4305-03 15:45:24.317: E/WindowManager(30614): at android.app.AlertDialog$Builder.show(AlertDialog.java:951)
4405-03 15:45:24.317: E/WindowManager(30614): at de.[...].MainActivity$4.run(MainActivity.java:379)

EDIT (03.05.2013 16.44)

Habe mal noch ein bisschen rumprobiert und festgestellt, dass wenn ich das Layout "dialog_signin" (welches in setView() gesetzt ist) verändere und meine 2 EditText entnehme, stürtzt die App nicht ab. Nachfolgend noch mein "dialog_signin.xml":

1<?xml version="1.0" encoding="utf-8"?>
2<LinearLayout xmlns:android="h_ttp://schemas.android.com/apk/res/android"
3 android:orientation="vertical"
4 android:layout_width="wrap_content"
5 android:layout_height="wrap_content"
6 android:id="@+id/dialog_signin">
7
8 <EditText
9 android:id="@+id/signin_username"
10 android:inputType="text"
11 android:layout_width="match_parent"
12 android:layout_height="wrap_content"
13 android:layout_marginTop="16dp"
14 android:layout_marginLeft="4dp"
15 android:layout_marginRight="4dp"
16 android:layout_marginBottom="4dp"
17 android:hint="@string/username" />
18
19 <EditText
20 android:id="@+id/signin_password"
21 android:inputType="textPassword"
22 android:layout_width="match_parent"
23 android:layout_height="wrap_content"
24 android:layout_marginTop="4dp"
25 android:layout_marginLeft="4dp"
26 android:layout_marginRight="4dp"
27 android:layout_marginBottom="16dp"
28 android:hint="@string/password" />
29</LinearLayout>

— geändert am 03.05.2013, 16:44:35

Antworten
Willy F.
  • Forum-Beiträge: 6

03.05.2013, 19:11:54 via Website

Ich habe es hinbekommen, zwar habe ich das Problem nicht gefunden, sonder habe es umgangen. Ich habe dazu einfach den Code
1new Thread() {
2 public void run() {
3 Looper.prepare();
4 [...]
5 Looper.loop();
6 }
7}.start();
vom AlertDialog genommen und diese um meinen ProgressDialog weiter oben im Code (noch vor dem AlertDialog) gesetzt.

Ich hoffe, ich kann damit anderen Helfen, die das selber/ähnliche Problem haben wie ich.

mfg Willy

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

04.05.2013, 13:41:37 via Website

Du kannst einfach nicht von Thread XYZ auf die UI zugreifen. Android achtet drauf das du das nur über den MainThread machen kannst.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Willy F.
  • Forum-Beiträge: 6

04.05.2013, 18:24:01 via Website

Das Problem war ja, dass es mal ging und mal nicht. Hab es aber ja jetzt hinbekommen. :)

mfg Willy

Antworten