Android 在服务类中显示ProgressDialog
我正在使用服务通过异步任务连接到网络。我想显示ProgressDialog,直到应用程序连接到网络。但是我该怎么做呢 我的服务如下所示:Android 在服务类中显示ProgressDialog,android,android-asynctask,android-service,progressdialog,Android,Android Asynctask,Android Service,Progressdialog,我正在使用服务通过异步任务连接到网络。我想显示ProgressDialog,直到应用程序连接到网络。但是我该怎么做呢 我的服务如下所示: package de.bertrandt.bertrandtknx; import tuwien.auto.calimero.link.KNXNetworkLinkIP; import tuwien.auto.calimero.process.ProcessCommunicator; import de.bertrandt.bertrandtknx.Cont
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;
}
}
}
包de.bertrandt.bertrandtknx;
导入tuwien.auto.calimero.link.KNXNetworkLinkIP;
导入tuwien.auto.calimero.process.ProcessCommunicator;
导入de.bertrandt.bertrandtknx.Controls.OnOff;
导入android.app.ProgressDialog;
导入android.app.Service;
导入android.content.Intent;
导入android.net.wifi.WifiInfo;
导入android.net.wifi.WifiManager;
导入android.os.AsyncTask;
导入android.os.IBinder;
导入android.widget.Toast;
公共类连接服务扩展服务{
公共静态KNXNetworkLinkIP m_netLinkIp=null;
专用静态ProcessCommunicator m_pc=null;
@凌驾
公共IBinder onBind(意向){
返回null;
}
@凌驾
public void onCreate(){
//首次创建服务时要执行的代码
新建Connect().execute();
}
@凌驾
公共空间{
//服务关闭时要执行的代码
新建Disconnect().execute();
}
public void onstart命令(Intent Intent,int startid){
//服务启动时要执行的代码
}
/**
*GetIPAddress异步
* */
公共字符串getIpAddr(){
WifiManager WifiManager=(WifiManager)getSystemService(WIFI_服务);
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));
返回ipString.toString();
}
/**
*异步连接
* */
私有类连接扩展异步任务{
进程对话;
布尔ok;
@凌驾
受保护的字符串doInBackground(字符串…参数){
试一试{
//获取本地IP地址
字符串ipAddress=getIpAddr();
System.out.println(“WiFi地址为”+ipAddress);
m_netLinkIp=Calimero.Util.connect(ipAddress,“192.168.0.2”);
if(m_netLinkIp==null){
System.out.println(“无法连接到Demobard”);
ok=假;
}
否则{
System.out.println(“连接到Demoboard”);
ok=正确;
}
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(字符串结果){
//dialog.dismise();
Toast.makeText(getApplicationContext(),
“详细说明mit演示板”+
((ok==true)?“hergestellt”:“fehlgeschlagen”),Toast.LENGTH\u LONG.show();
如果(确定==错误){
//显示重新连接对话框
//重新连接_对话框();
}
}
@凌驾
受保护的void onPreExecute(){
//设置进度对话框
dialog=新建ProgressDialog(OnOff.this);
setProgressStyle(ProgressDialog.STYLE_微调器);
setMessage(“Bite-warten,verbinde-mit KNX板”);
对话框。setUndeterminate(true);
dialog.show()*/
}
}
/**
*断开异步
* */
私有类断开扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…参数){
试一试{
Calimero.Util.disconnect(m_netLinkIp);
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
}
}
当然,这段代码会产生一些问题,如何获取启动服务的活动的上下文
该对话框应显示在启动服务的活动中,直到应用程序连接为止 因此服务不是您必须使用观察者模式的UI。您的活动必须在服务中注册一个侦听器,以便服务可以通知活动特殊事件(如开始加载或完成加载) 您必须将以下intercae添加到您的服务类中:
public interface serviceObserver {
public void startLoading();
public void stopLoading();
}
您的活动必须实现serviceObserver。您的服务必须存储活动中创建的serviceObserver的实例。
如果您的服务在没有活动的情况下运行,我建议您使用广播接收器进行通信。您不能,对话框本身必须是活动。我会将DialogActivity作为新任务启动,使用singleTask模式并使用onNewIntent捕获值更新OK,但如果我在活动本身内部创建对话框,我如何知道连接是否已建立?我是否必须使用
处理程序
?我将启动一个对话框活动,意图表明连接正在建立,然后向该活动发送意图(调用startActivity,singleTask活动接收对onNewIntent的调用)我不知道如何才能做到这一点,因为我的服务中的AsyncTask需要对话框引用。。你有没有一个例子,或者你能帮我提供一个更详细的代码片段一个服务不是UI。因此,服务不应该访问UI!因此,使用AsyncTaskUI方法是个坏主意!使用广播将是更好的选择。如果您的服务只在您的活动中运行,您不需要服务,因此您可以自行选择一个不带服务的AsyncTask或Thread类。为异步任务提供活动的上下文是一个非常糟糕的主意。因为你永远不知道你的环境是否仍然活跃。看看MVC(谷歌)