Zeigen ProgressDialog in einer Service-Klasse
Ich bin mit einem Dienst zu verbinden, um eine Netzwerkverbindung über einen AsyncTask. Ich will zeigen, einen ProgressDialog, bis die app mit dem Netzwerk verbunden ist. Aber wie kann ich dies tun?
Mein Service sieht so aus:
package de.bertrandt.bertrandtknx;
import tuwien.auto.calimero.link.KNXNetworkLinkIP;
import tuwien.auto.calimero.process.ProcessCommunicator;
import de.bertrandt.bertrandtknx.Controls.OnOff;
import android.app.ProgressDialog;
import android.app.Service;
import android.content.Intent;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.IBinder;
import android.widget.Toast;
public class ConnectionService extends Service {
public static KNXNetworkLinkIP m_netLinkIp = null;
private static ProcessCommunicator m_pc = null;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
//code to execute when the service is first created
new Connect().execute();
}
@Override
public void onDestroy() {
//code to execute when the service is shutting down
new Disconnect().execute();
}
public void onStartCommand(Intent intent, int startid) {
//code to execute when the service is starting up
}
/**
* GetIPAddress Async
* */
public String getIpAddr() {
WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ip = wifiInfo.getIpAddress();
String ipString = String.format(
"%d.%d.%d.%d",
(ip & 0xff),
(ip >> 8 & 0xff),
(ip >> 16 & 0xff),
(ip >> 24 & 0xff));
return ipString.toString();
}
/**
* Connect Async
* */
private class Connect extends AsyncTask<String, Void, String> {
ProgressDialog dialog;
boolean ok;
@Override
protected String doInBackground(String... params) {
try {
//get local IP address
String ipAddress = getIpAddr();
System.out.println("WiFi address is " + ipAddress);
m_netLinkIp = Calimero.Util.connect(ipAddress, "192.168.0.2");
if (m_netLinkIp == null){
System.out.println("Can not connect to Demobard");
ok = false;
}
else{
System.out.println("Connected to Demoboard");
ok = true;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
//dialog.dismiss();
Toast.makeText(getApplicationContext(),
"Verbindung mit Demoboard " +
((ok == true) ? "hergestellt" : "fehlgeschlagen"), Toast.LENGTH_LONG).show();
if(ok == false){
//show reconnect dialog
//reconnect_dialog();
}
}
@Override
protected void onPreExecute() {
//Setup Progress Dialog
dialog = new ProgressDialog(OnOff.this);
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setMessage("Bitte warten, verbinde mit KNX-Board");
dialog.setIndeterminate(true);
dialog.show();*/
}
}
/**
* Disconnect Async
* */
private class Disconnect extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
try {
Calimero.Util.disconnect(m_netLinkIp);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
}
Natürlich dieser code Probleme macht, wie bekomme ich den Kontext der Aktivität, die den Dienst gestartet?
Dialog angezeigt werden soll, in die Tätigkeit, die den Dienst gestartet, bis die app verbunden ist.
- Sie kann nicht, muss ein Dialog gestartet werden, aus der sich eine Aktivität.
- Ich würde anfangen, die DialogActivity als NEW_TASK, mit einem singleTask-Modus und mit onNewIntent zu fangen Wert aktualisiert
- ok, aber wenn ich den dialog innerhalb der Aktivität selbst, wie kann ich wissen, ob die Verbindung hergestellt ist? Muss ich eine
Handler
? - ich würde eine dialog-Aktivität mit der Absicht angibt, dass die Verbindung aufzubauen, dann senden Sie beabsichtigt, diese Tätigkeit (Aufruf von startActivity, die singleTask-Aktivität empfängt Anrufe zu onNewIntent.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
So ein service ist NICHT der UI müssen Sie die Verwendung des observer-Musters. Ihre Aktivitäten müssen einen listener registrieren, der Dienst, so dass der service zu informieren, die die Aktivität spezieller events (z.B. start laden oder geladen).
Müssen Sie folgende intercae in Ihre service-Klasse:
Ihre Tätigkeit zu implementieren hat serviceObserver. Ihr service hat zum speichern einer Instanz von serviceObserver, die erstellt werden, in der Tätigkeit.
Wenn der service ausgeführt wird, ohne Ihre Aktivität, die ich empfehlen die Verwendung von broadcast-Empfänger für die Kommunikation.