ProgressDialog in einer Serviceklasse anzeigen
Ich verwende einen Dienst, um über eine AsyncTask eine Verbindung zu einem Netzwerk herzustellen. Ich möchte einen ProgressDialog anzeigen, bis die App mit dem Netzwerk verbunden ist. Aber wie kann ich das machen?
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 macht dieser Code Probleme, wie kann ich den Kontext der Aktivität ermitteln, mit der der Service gestartet wird?
Der Dialog sollte in der Aktivität angezeigt werden, die den Dienst startet, bis die App verbunden ist.