ListView füllen mit Thread (Dialog)

A

AlexRock

Neues Mitglied
0
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();
    }
 
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!
 
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();
 
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" :)
 
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);
 
naja logcat sagt, du bist im falschen thread um die ui elemente zu verändern.

mach dein listview update im UI thread
 
Nimm einen AsyncTask und mach dein GUI Update im onPostExecute(), dafür ist er ja da.
 
Entweder so, oder mit einem Handler synchronisieren.

Schau mal hier
 
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
 

Ähnliche Themen

A
Antworten
10
Aufrufe
1.017
swa00
swa00
W
  • waltsoft
Antworten
4
Aufrufe
935
waltsoft
W
D
Antworten
9
Aufrufe
1.762
jogimuc
J
Zurück
Oben Unten