1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

ListView füllen mit Thread (Dialog)

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von AlexRock, 31.07.2011.

  1. AlexRock, 31.07.2011 #1
    AlexRock

    AlexRock Threadstarter Junior Mitglied

    Beiträge:
    38
    Erhaltene Danke:
    0
    Registriert seit:
    02.02.2010
    Phone:
    HTC Hero
    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

    Beiträge:
    913
    Erhaltene Danke:
    199
    Registriert seit:
    27.08.2010
    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

    Beiträge:
    38
    Erhaltene Danke:
    0
    Registriert seit:
    02.02.2010
    Phone:
    HTC Hero
    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

    Beiträge:
    913
    Erhaltene Danke:
    199
    Registriert seit:
    27.08.2010
    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

    Beiträge:
    38
    Erhaltene Danke:
    0
    Registriert seit:
    02.02.2010
    Phone:
    HTC Hero
    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

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    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

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    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

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Entweder so, oder mit einem Handler synchronisieren.

    Schau mal hier
     
  9. AlexRock, 01.08.2011 #9
    AlexRock

    AlexRock Threadstarter Junior Mitglied

    Beiträge:
    38
    Erhaltene Danke:
    0
    Registriert seit:
    02.02.2010
    Phone:
    HTC Hero
    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