Hallo,
ich versuche gerade eine ProgressBar (horizontal) zu basteln.
Dabei soll diese mehrer Zeitabschnitte durchlaufen z.B. int [ ] times = { 10 , 5 , 8 , 15 };
Zwischendurch sollte man den Prozess auch anhalten können.
Als erstes hab ich das ganze mit einem CountDownTimer versucht aber der hat nie bis zum ende gezählt, war ein bisschen seltsam das ganze.
Jetzt bin ich dabei das ganze mit einem extra Thread zu basteln.
Dabei ist aber das Problem des anderen Thread anzuhalten bzw mitgeteilt zu bekommen dass zb times[0] erledigt ist und ich einen neuen Thread mit times[1] starten kann.
Bei Anhalten weis ich nicht wie das geht. myThread.destroy() stürzt die App ab und bei stop() auch ... mit interrupt() stürzt die kiste nicht ab aber es passiert auch nicht.
hier mal mein code:
package de.heinrich;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ProgressBar;
import android.widget.Toast;
public class ProgressActivity extends Activity {
ProgressBar myProgressBar;
Thread barThread = null;
int myProgress = 0;
int delay = 1000; // eine Sekunde delay
int maxBarValue;
boolean ready = true;
boolean STOP = false;
private final int FINISH = 0;
private static final int CONTINUE = 1;
private static final int MENU_BACK = 1;
private static final int MENU_10 = 2;
private static final int MENU_20 = 3;
private static final int MENU_TIMES = 4;
private static final int STOP_THREAD = 5;
private int[] times = {10, 2, 5, 6, 4};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.progress);
myProgressBar = (ProgressBar) findViewById(R.id.progress_bar);
}
private Runnable myThread = new Runnable() {
@Override
public void run() {
while (myProgress < maxBarValue && !STOP) {
try {
myHandle.sendMessage(myHandle.obtainMessage(CONTINUE));
Thread.sleep(delay);
} catch (Throwable t) {
}
}
myHandle.sendMessage(myHandle.obtainMessage(FINISH));
}
Handler myHandle = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case CONTINUE:
myProgressBar.setProgress(++myProgress);
break;
case FINISH:
myProgress = 0;
myProgressBar.setProgress(myProgress);
ready = true;
Toast.makeText(ProgressActivity.this, "Fertig", Toast.LENGTH_LONG).show();
break;
}
}
};
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, MENU_BACK, 0, "Back");
menu.add(0, MENU_10, 0, "Start 10");
menu.add(0, MENU_20, 0, "Start 20");
menu.add(0, MENU_TIMES, 0, "Start Sequenz");
menu.add(0, STOP_THREAD, 0, "Anhalten");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_BACK:
Intent MyIntent = new Intent(ProgressActivity.this, StartActivity.class);
startActivityForResult(MyIntent, 0);
break;
case MENU_10:
maxBarValue = 10;
myProgressBar.setMax(maxBarValue);
barThread = new Thread(myThread);
barThread.start();
break;
case MENU_20:
maxBarValue = 20;
myProgressBar.setMax(maxBarValue);
barThread = new Thread(myThread);
barThread.start();
break;
case MENU_TIMES:
int i = 0;
while (i < times.length) {
if (ready) {
maxBarValue = times[i];
myProgressBar.setMax(times[i]);
barThread = new Thread(myThread);
barThread.start();
ready = false;
i++;
}
}
break;
case STOP_THREAD:
Thread r = barThread;
if (r != null) {
r.interrupt();
}
break;
}
return super.onOptionsItemSelected(item);
}
}
Alles anzeigen
mit ready habe ich versucht zu erfahren dass der andere Thread abgeschlossen ist aber das funktioniert iwie nicht.
Gruß