HandlerThread
ist eine bessere Option als normale Java-Threads in Android.
- Erstellen einer HandlerThread und starten Sie es
- Erstellen einer Handler con Looper von HandlerThread :
requestHandler
post
a Runnable
Aufgabe an requestHandler
Kommunikation mit UI Thread von HandlerThread
- Erstellen einer
Handler
con Looper
für den Hauptfaden : responseHandler
und außer Kraft setzen handleMessage
Methode
- Innerhalb
Runnable
Aufgabe eines anderen Threads ( HandlerThread
in diesem Fall), rufen Sie sendMessage
sur responseHandler
- Diese
sendMessage
Ergebnis Aufruf von handleMessage
en responseHandler
.
- Holen Sie sich Attribute aus der
Message
und verarbeiten, UI aktualisieren
Ejemplo : Aktualisierung TextView
mit den von einem Webdienst empfangenen Daten. Da der Webdienst auf einem Nicht-UI-Thread aufgerufen werden sollte, wurde HandlerThread
für den Netzbetrieb. Sobald Sie den Inhalt vom Webdienst erhalten haben, senden Sie eine Nachricht an Ihren Haupt-Thread (UI-Thread) und die Handler
behandelt die Nachricht und aktualisiert die Benutzeroberfläche.
Beispiel-Code:
HandlerThread handlerThread = new HandlerThread("NetworkOperation");
handlerThread.start();
Handler requestHandler = new Handler(handlerThread.getLooper());
final Handler responseHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
txtView.setText((String) msg.obj);
}
};
Runnable myRunnable = new Runnable() {
@Override
public void run() {
try {
Log.d("Runnable", "Before IO call");
URL page = new URL("http://www.your_web_site.com/fetchData.jsp");
StringBuffer text = new StringBuffer();
HttpURLConnection conn = (HttpURLConnection) page.openConnection();
conn.connect();
InputStreamReader in = new InputStreamReader((InputStream) conn.getContent());
BufferedReader buff = new BufferedReader(in);
String line;
while ((line = buff.readLine()) != null) {
text.append(line + "\n");
}
Log.d("Runnable", "After IO call:"+ text.toString());
Message msg = new Message();
msg.obj = text.toString();
responseHandler.sendMessage(msg);
} catch (Exception err) {
err.printStackTrace();
}
}
};
requestHandler.post(myRunnable);
Nützliche Artikel:
handlerthreads-und-warum-man-sie-in-ihren-Android-Apps-verwenden-sollte
Android-looper-handler-handlerthread-i