Nach einigem Nachdenken und größeren Küstlerpausen, die gewünschte Antwort auf meine Frage.
Das Grundgerüst einer einfachen Activity ohne Schnikschnak.
Ein Arbeitsthread, der in einer separaten Klasse liegt und zyklisch Ergebnisse sendet.
Der Handler als Kommunikationsmedium zudem static mit einer WeakReference, dass die Warnung verschwindet.
Die zugehörige View besteht nur aus dem verlinkten Textview und einer Statusbar.
Hoffe das ganze arbeitet ressourcenarm, damit die Berechnungen möglichst komplex werden können.
Verbesserungsvorschläge sind natürlich willkommen.
Java
package example.akkustiksynth.de.threadhandler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ProgressBar;
import android.widget.TextView;
import java.lang.ref.WeakReference;
public class MainActivity extends Activity {
ProgressBar progressBar1;
TextView textView1;
MainHandler mainHandler1;
Thread thread1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// UI-Elemente zuweisen
progressBar1 = (ProgressBar) findViewById(R.id.progressBar01);
textView1 = (TextView) findViewById(R.id.textView2);
// Weitere Elemente
mainHandler1 = new MainHandler(this); // vor Thread erzeugen (Gleichzeitigkeit)
thread1 = new WorkerThread(mainHandler1);
thread1.start();
}
public void updateResults(int info1) {
textView1.setText(String.valueOf(info1));
progressBar1.setProgress(info1);
}
// UI-Handler statisch mit WeakReference gegen Memory-leaks
private static class MainHandler extends Handler {
private final WeakReference<MainActivity> currentActivity1;
public MainHandler(MainActivity activity1) {
currentActivity1 = new WeakReference<MainActivity>(activity1);
}
@Override
public void handleMessage(Message message) {
MainActivity activity = currentActivity1.get();
if (activity != null){
activity.updateResults(message.getData().getInt("info"));
}
}
};
/* // Thread als interne Klasse
public class WorkerThread extends Thread {
@Override
public void run() {
for (int i=0; i<=100; i++) {
Bundle bundle1 = new Bundle();
Message message1 = Message.obtain();
bundle1.putInt("info", i);
message1.setData(bundle1);
mainHandler1.sendMessage(message1);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
return;
}
}
}
}*/
}
Alles anzeigen
Code
package example.akkustiksynth.de.threadhandler;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
public class WorkerThread extends Thread {
Handler threadHandler1;
public WorkerThread(Handler handler1) {
threadHandler1 = handler1; // Handler mit UI-Handler verbinden
}
@Override
public void run() {
for (int i=0; i<=100; i++) {
// einfachen INT-Wert zyklisch senden
Bundle bundle1 = new Bundle();
Message message1 = Message.obtain(); // oder new Message();
bundle1.putInt("info", i);
message1.setData(bundle1);
threadHandler1.sendMessage(message1);
// Thread takten / pausieren
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
return;
}
}
}
}
Alles anzeigen