AsyncTask - Progressbar Problem

K

Kiodok

Neues Mitglied
0
Hallo Leute,
Ich bin neu hier und wollt ma wissen ob mir jemand mein kleines Problem mit der Progressbar Lösen kann.
Ich hab schon en paar sachen versucht, komme aber einfach nicht auf die Lösung.

Ich möchte, dass die Progressbar am Ende um eins hochzählt bei einer TextView, die in der gleichen App steckt aber in einer anderen Aktivity.
Hört sich etwas kompliziert an, muss man ein wenig um die Ecke denken, aber ich schätze ma ihr versteht was ich meine.
Im Grundsatz will ich, dass eine Progressbar jedes mal wenn sie auf 100 ist, bei einer TextView +1 macht.

Hier der Code:
Javascript:
public class Morma extends AppCompatActivity {

class MormaKaugummi extends AsyncTask<String, String, String> {

    private int count = 0;
    private void count() {
        count++;
    }

    private void update() {
        TextView counter = (TextView) findViewById(R.id.counter);
        String Kcounter = Integer.toString(count);
        counter.setText(Kcounter);
    }

    @Override
    protected String doInBackground(String... params) {
        count();
        update();
        return null;
    }
}

private ProgressBar progressBarKaugummi;
private int progressStatusKaugummi = 0;
private Handler handlerKaugummi = new Handler();

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_morma);
    Button buttonMormaKaugummiKlauen = (Button) findViewById(R.id.buttonMormaKaugummiKlauen);

    buttonMormaKaugummiKlauen.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            progressBarKaugummi = (ProgressBar) findViewById(R.id.progressBarMormaKaugummi);
            new Thread(new Runnable() {
                public void run() {
                    while (progressStatusKaugummi < 100) {
                        progressStatusKaugummi += 1;
                        handlerKaugummi.post(new Runnable() {
                            public void run() {
                                progressBarKaugummi.setProgress(progressStatusKaugummi);
                            }
                        });
                        try {
                            Thread.sleep(4000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
            if (progressStatusKaugummi == 100) {
                progressBarKaugummi.setProgress(0);
                recreate();
                new MormaKaugummi().execute();
            }
        }
    });
Hier die logcat:
Javascript:
11-07 13:48:34.964 622-1376/peppermine_studios.criminallife E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
11-07 13:48:34.964 622-1376/peppermine_studios.criminallife E/AndroidRuntime: java.lang.RuntimeException: An error occured while executing doInBackground()
11-07 13:48:34.964 622-1376/peppermine_studios.criminallife E/AndroidRuntime:     at android.os.AsyncTask$3.done(AsyncTask.java:299)
11-07 13:48:34.964 622-1376/peppermine_studios.criminallife E/AndroidRuntime:     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
11-07 13:48:34.964 622-1376/peppermine_studios.criminallife E/AndroidRuntime:     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
11-07 13:48:34.964 622-1376/peppermine_studios.criminallife E/AndroidRuntime:     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
11-07 13:48:34.964 622-1376/peppermine_studios.criminallife E/AndroidRuntime:     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
11-07 13:48:34.964 622-1376/peppermine_studios.criminallife E/AndroidRuntime:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
11-07 13:48:34.964 622-1376/peppermine_studios.criminallife E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
11-07 13:48:34.964 622-1376/peppermine_studios.criminallife E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
11-07 13:48:34.964 622-1376/peppermine_studios.criminallife E/AndroidRuntime:     at java.lang.Thread.run(Thread.java:856)
11-07 13:48:34.964 622-1376/peppermine_studios.criminallife E/AndroidRuntime:  Caused by: java.lang.NullPointerException
11-07 13:48:34.964 622-1376/peppermine_studios.criminallife E/AndroidRuntime:     at peppermine_studios.criminallife.Morma$MormaKaugummi.update(Morma.java:26)
11-07 13:48:34.964 622-1376/peppermine_studios.criminallife E/AndroidRuntime:     at peppermine_studios.criminallife.Morma$MormaKaugummi.doInBackground(Morma.java:32)
11-07 13:48:34.964 622-1376/peppermine_studios.criminallife E/AndroidRuntime:     at peppermine_studios.criminallife.Morma$MormaKaugummi.doInBackground(Morma.java:15)
11-07 13:48:34.964 622-1376/peppermine_studios.criminallife E/AndroidRuntime:     at android.os.AsyncTask$2.call(AsyncTask.java:287)
11-07 13:48:34.964 622-1376/peppermine_studios.criminallife E/AndroidRuntime:     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
11-07 13:48:34.964 622-1376/peppermine_studios.criminallife E/AndroidRuntime:     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
11-07 13:48:34.964 622-1376/peppermine_studios.criminallife E/AndroidRuntime:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
11-07 13:48:34.964 622-1376/peppermine_studios.criminallife E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
11-07 13:48:34.964 622-1376/peppermine_studios.criminallife E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
11-07 13:48:34.964 622-1376/peppermine_studios.criminallife E/AndroidRuntime:     at java.lang.Thread.run(Thread.java:856)
11-07 13:48:35.514 622-622/peppermine_studios.criminallife W/EGL_emulation: eglSurfaceAttrib not implemented
11-07 13:48:35.674 622-622/peppermine_studios.criminallife W/EGL_emulation: eglSurfaceAttrib not implemented
11-07 13:48:37.364 622-1376/? I/Process: Sending signal. PID: 622 SIG: 9

Ich hoffe jemand kann mir ne Lösung präsentieren.
 
Also das erste Problem weshalb die NullPointerException auftritt ist wohl dass die findViewById() Methode nicht in einem Thread genutzt werden sollte der im Hintergrund läuft. Am besten machst du das TextView global und initalisierst es in der onCreate() Methode.

Wenn der Fehler weg ist wird es allerdings immer noch nicht funktionieren. Die Abfrage ob "progressStatusKaugummi" gleich 100 ist steht an der falschen Stelle und wird schon aufgerufen bevor der Thread im Hintergrund fertig hochgezählt hat. Versuche das doch mal direkt hinter der while Schleife im gleichen Thread auszuführen, dann kannst du das if auch weglassen.
 
Kiodok schrieb:
Ich möchte, dass die Progressbar am Ende um eins hochzählt bei einer TextView, die in der gleichen App steckt aber in einer anderen Aktivity.

Meinst du das Ernst? :)

Vom Background-Thread auf die UI zugreifen ist immer kritisch, ebenso in einer Update-Methode zu initialisieren - außer man möchte testen wie viel die neuen Octacores so leisten, hehe. Ein Interface könnte der Sache etwas die "Verkomplizierung" nehmen...

Ich verstehe aber zugegebenermaßen generell den Ablauf nicht, sehe nur 1x AsyncTask und noch eine verschachtelte run in einer run-Methode.

Mach es doch lieber so
Code:
while (bedingung?) {
                       if( < 100 )  {
                                      tv mit +1 updaten  UND ProgressBar =0
                        } else +1 für ProgressBar
}

Dafür brauchst du nur einen Thread, weil es Android ja bekanntlich nicht mag, wenn man einfach mal ne "while" laufen lässt ;)

Nicht schön, aber des Rätsels Lösung:
Code:
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (mI < 100) {
mI++;
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
progressDialog.setProgress(mI);
mTv.setText("ctr: " + mJ);
}
});
} else {
mI = 0;
mJ++;
}
}
}
});
thread.start();
 
Zuletzt bearbeitet:

Ähnliche Themen

5
Antworten
0
Aufrufe
1.104
586920
5
SaniMatthias
Antworten
19
Aufrufe
858
swa00
swa00
D
Antworten
23
Aufrufe
2.311
Data2006
D
Zurück
Oben Unten