我想使用Service
使用AsyncTask建立我的连接。我希望在每个活动中都有一个引用变量m_netLinkIp
,这是在建立连接期间创建的。
目前我的服务看起来像这样:
package de.bertrandt.bertrandtknx;
import de.bertrandt.bertrandtknx.Controls.Dimmer;
import tuwien.auto.calimero.link.KNXNetworkLinkIP;
import tuwien.auto.calimero.process.ProcessCommunicator;
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.os.RemoteException;
import android.util.Log;
import android.widget.Toast;
public class ConnectionService extends Service {
private static final String TAG = "ConnectionService";
private static KNXNetworkLinkIP m_netLinkIp = null;
private static ProcessCommunicator m_pc = null;
private static boolean connection_ok;
@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();
}
@Override
public void onStart(Intent intent, int startid) {
//code to execute when the service is starting up
}
/**
* 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(Dimmer.this);
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setMessage("Bitte warten, verbinde mit KNX-Board");
dialog.setIndeterminate(true);
dialog.show();
}
}
/**
* 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();
}
/**
* 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;
}
}
}
所以这是我的问题:
1.。)如何在我的任何活动中调用服务并获取对m_netLinkIp
变量的引用,以便我不必在每个活动中重新连接?目前我称之为:startService(new Intent(this, ConnectionService.class));
解决方案:我将Service类中的全局变量更改为public static KNXNetworkLinkIP m_netLinkIp = null;
,现在我可以在每个活动中调用它:m_netLinkIp= ConnectionService.m_netLinkIp;
2.。)如何在每项活动中显示ProgressBar?我必须在声明中添加活动:dialog = new ProgressDialog(Dimmer.this);
谢谢!
答案 0 :(得分:0)
我在下载服务时遇到了同样的问题。最初,我有一个包含很多样板代码的包含布局来响应binder的回调事件。现在我有一个自包含的片段,我添加到每个需要显示进度的活动中。