1. Wir haben diesmal 2 Gewinnspiele zeitgleich für euch - Gewinne einmal ein UMI Plus E - Beim 2ten könnt ihr ein Nomu S30 gewinnen!
  1. AlexRock, 31.07.2011 #1
    AlexRock

    AlexRock Threadstarter Junior Mitglied

    Hallo,
    ich lasse in der OnCreate meine ListView mit Daten füllen.
    Nun möchte ich während dessen einen ProgressDialog anzeigen lassen.
    Wenn ich alles dickgeschriebene in das run() mit reinschreibe gibt es folgenden Fehler:
    Wenn ich es so wie ich es jetzt gepostet habe mache funktioniert es

    Code:
    07-31 14:37:35.868: ERROR/AndroidRuntime(9628): FATAL EXCEPTION: main
    07-31 14:37:35.868: ERROR/AndroidRuntime(9628): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.rocky.info/de.rocky.info.MainActivity}: java.lang.NullPointerException
    07-31 14:37:35.868: ERROR/AndroidRuntime(9628):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1816)
    07-31 14:37:35.868: ERROR/AndroidRuntime(9628):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1837)
    07-31 14:37:35.868: ERROR/AndroidRuntime(9628):     at android.app.ActivityThread.access$1500(ActivityThread.java:132)
    07-31 14:37:35.868: ERROR/AndroidRuntime(9628):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1033)
    07-31 14:37:35.868: ERROR/AndroidRuntime(9628):     at android.os.Handler.dispatchMessage(Handler.java:99)
    07-31 14:37:35.868: ERROR/AndroidRuntime(9628):     at android.os.Looper.loop(Looper.java:143)
    07-31 14:37:35.868: ERROR/AndroidRuntime(9628):     at android.app.ActivityThread.main(ActivityThread.java:4196)
    07-31 14:37:35.868: ERROR/AndroidRuntime(9628):     at java.lang.reflect.Method.invokeNative(Native Method)
    07-31 14:37:35.868: ERROR/AndroidRuntime(9628):     at java.lang.reflect.Method.invoke(Method.java:507)
    07-31 14:37:35.868: ERROR/AndroidRuntime(9628):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    07-31 14:37:35.868: ERROR/AndroidRuntime(9628):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    07-31 14:37:35.868: ERROR/AndroidRuntime(9628):     at dalvik.system.NativeStart.main(Native Method)
    07-31 14:37:35.868: ERROR/AndroidRuntime(9628): Caused by: java.lang.NullPointerException
    07-31 14:37:35.868: ERROR/AndroidRuntime(9628):     at de.rocky.info.AppListAdapter.getCount(AppListAdapter.java:39)
    07-31 14:37:35.868: ERROR/AndroidRuntime(9628):     at android.widget.ListView.setAdapter(ListView.java:454)
    07-31 14:37:35.868: ERROR/AndroidRuntime(9628):     at de.rocky.info.MainActivity.onCreate(MainActivity.java:78)
    07-31 14:37:35.868: ERROR/AndroidRuntime(9628):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
    07-31 14:37:35.868: ERROR/AndroidRuntime(9628):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1780)
    07-31 14:37:35.868: ERROR/AndroidRuntime(9628):     ... 11 more
    07-31 14:37:35.908: WARN/ActivityManager(1423):   Force finishing activity de.rocky.info/.MainActivity
    
    Code:
    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.applist);
    
            [B]mApps = loadInstalledApps(INCLUDE_SYSTEM_APPS);
            new LoadIconsTask().execute(mApps.toArray(new App[] {}));[/B]
    
            mAppsList = (ListView) findViewById(R.id.app_list_view);
            mAppsList.setOnItemClickListener(MainActivity.this);
    
            mAdapter = new AppListAdapter(getApplicationContext());
            mAdapter.setListItems(mApps);
            mAppsList.setAdapter(mAdapter);
            
            get_apps = ProgressDialog.show(MainActivity.this,
                    "Bitte Warten...", "Anwendungen werden geladen", false);
    
            new Thread() {
                public void run() {
                    try {
                        // Do some Fake-Work
                        sleep(5000);
                    } catch (Exception e) {
                    }
                    // Dismiss the Dialog
                    get_apps.dismiss();
                }
            }.start();
        }
    
     
  2. v Ralle v, 31.07.2011 #2
    v Ralle v

    v Ralle v Android-Lexikon

    Ich versteh dein Problem hier nicht ganz, weil die Fehlermeldung doch alles explizit sagt: es gibt eine NullPointerException in Zeile 39 von deiner Klasse AppListAdapter.

    Das Problem musst du selber lösen!
     
  3. AlexRock, 31.07.2011 #3
    AlexRock

    AlexRock Threadstarter Junior Mitglied

    Hallo,

    Mein Fehler tritt auf wenn die beiden Bold-Zeilen im try{} Block stehen.

    Ich nehme an das liegt daran das diese Zeile dann nix zu setzen hat:
    Code:
    mAdapter.setListItems(mApps);
    
    Auch wenn ich alles mitnehme in die run() gibt es folgenden fehler

    Code:
    07-31 15:22:25.527: ERROR/AndroidRuntime(10606): FATAL EXCEPTION: Thread-9
    07-31 15:22:25.527: ERROR/AndroidRuntime(10606): java.lang.ExceptionInInitializerError
    07-31 15:22:25.527: ERROR/AndroidRuntime(10606):     at de.rocky.info.MainActivity$3.run(MainActivity.java:77)
    07-31 15:22:25.527: ERROR/AndroidRuntime(10606): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
    07-31 15:22:25.527: ERROR/AndroidRuntime(10606):     at android.os.Handler.<init>(Handler.java:121)
    07-31 15:22:25.527: ERROR/AndroidRuntime(10606):     at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
    07-31 15:22:25.527: ERROR/AndroidRuntime(10606):     at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
    07-31 15:22:25.527: ERROR/AndroidRuntime(10606):     at android.os.AsyncTask.<clinit>(AsyncTask.java:152)
    
    Wann müsste ich

    • Looper.prepare();
    • Looper.loop();
    • Looper.MyLoop().quit();

    aufrufen (ist mir nicht ganz klar wann was)

    Code:
    get_apps = ProgressDialog.show(MainActivity.this,
                    getString(R.string.get_app_title), getString(R.string.get_app_message), false);
    
            new Thread() {
                public void run() {
                    try {
                        // Do some Fake-Work
                        //sleep(5000);
            mApps = loadInstalledApps(INCLUDE_SYSTEM_APPS);
            new LoadIconsTask().execute(mApps.toArray(new App[] {}));
            
            mAppsList = (ListView) findViewById(R.id.app_list_view);
            mAppsList.setOnItemClickListener(MainActivity.this);
    
            mAdapter = new AppListAdapter(getApplicationContext());
            mAdapter.setListItems(mApps);
            mAppsList.setAdapter(mAdapter);
                    } catch (Exception e) {
                    }
                    // Dismiss the Dialog
                    get_apps.dismiss();
                }
            }.start();
    
     
  4. v Ralle v, 31.07.2011 #4
    v Ralle v

    v Ralle v Android-Lexikon

    Dein Problem ist, dass du aus einem Worker-Thread auf den UI Thread zugreifen willst.

    Hier ist ein sehr guter Link, der das erklärt Android Guts: Intro to Loopers and Handlers Mind The Robot

    Besser kann ich es auch nicht erläutern und daher spare ich es mir den Text nochmal "abzuschreiben" :)
     
  5. AlexRock, 31.07.2011 #5
    AlexRock

    AlexRock Threadstarter Junior Mitglied

    Hallo,
    ich habe es nunsoweit hinbekommen..
    Nun zeigt er allerdings in der Liste keinerlei Elemente mehr an:
    Hat da jemand eine Idee?

    Code:
    get_apps = ProgressDialog.show(MainActivity.this,
                    getString(R.string.get_app_title),
                    getString(R.string.get_app_message), false);
    
            new Thread() {
                public void run() {
                    try {
                        Looper.prepare();
    
                        handler = new Handler();
    
                        mApps = loadInstalledApps(INCLUDE_SYSTEM_APPS);
                        new LoadIconsTask().execute(mApps.toArray(new App[] {}));
    
                        mAppsList = (ListView) findViewById(R.id.app_list_view);
                        mAppsList.setOnItemClickListener(MainActivity.this);
    
                        mAdapter = new AppListAdapter(getApplicationContext());
                        mAdapter.setListItems(mApps);
                        mAppsList.setAdapter(mAdapter);
    
                        // Do some Fake-Work
                        // sleep(5000);
                    } catch (Throwable t) {
                        Log.e("ERROR", "Fehler", t);
                    }
                    // Dismiss the Dialog
                    get_apps.dismiss();
                }
            }.start();
    
    Log Cat
    Code:
    07-31 22:44:28.236: ERROR/ERROR(6664): Fehler
    07-31 22:44:28.236: ERROR/ERROR(6664): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
    07-31 22:44:28.236: ERROR/ERROR(6664):     at android.view.ViewRoot.checkThread(ViewRoot.java:3094)
    07-31 22:44:28.236: ERROR/ERROR(6664):     at android.view.ViewRoot.invalidateChild(ViewRoot.java:659)
    07-31 22:44:28.236: ERROR/ERROR(6664):     at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:685)
    07-31 22:44:28.236: ERROR/ERROR(6664):     at android.view.ViewGroup.invalidateChild(ViewGroup.java:2575)
    07-31 22:44:28.236: ERROR/ERROR(6664):     at android.view.View.invalidate(View.java:5326)
    07-31 22:44:28.236: ERROR/ERROR(6664):     at android.widget.AbsListView.resetList(AbsListView.java:1120)
    07-31 22:44:28.236: ERROR/ERROR(6664):     at android.widget.ListView.resetList(ListView.java:511)
    07-31 22:44:28.236: ERROR/ERROR(6664):     at android.widget.ListView.setAdapter(ListView.java:440)
    07-31 22:44:28.236: ERROR/ERROR(6664):     at de.rocky.info.MainActivity$3.run(MainActivity.java:89)
    
    In Zeile 89 der MainActivity steht:
    Code:
    private ListView mAppsList;
    private AppListAdapter mAdapter;
    mAppsList.setAdapter(mAdapter);
    
     
  6. swordi, 01.08.2011 #6
    swordi

    swordi Gewerbliches Mitglied

    naja logcat sagt, du bist im falschen thread um die ui elemente zu verändern.

    mach dein listview update im UI thread
     
  7. the_alien, 01.08.2011 #7
    the_alien

    the_alien Android-Lexikon

    Nimm einen AsyncTask und mach dein GUI Update im onPostExecute(), dafür ist er ja da.
     
  8. Unicate, 01.08.2011 #8
    Unicate

    Unicate Android-Experte

    Entweder so, oder mit einem Handler synchronisieren.

    Schau mal hier
     
  9. AlexRock, 01.08.2011 #9
    AlexRock

    AlexRock Threadstarter Junior Mitglied

    Hallo,
    habe es nun gelöst bekommen, da im Hintergrund noch Icons geladen werden und diese etwas länger brauchen habe ich den ProgressDialog nun vom
    onPreExecute() genommen, der wird angezeigt und beendet sich dann auch nachdem die bilder geladen sind
     

Diese Seite empfehlen

Besucher kamen mit folgenden Begriffen auf unsere Seite:

  1. android Handler AsyncTask Thread