android - 在服务类中显示 ProgressDialog

标签 android android-asynctask android-service progressdialog

我正在使用服务通过 AsyncTask 连接到网络。我想在应用程序连接到网络之前显示 ProgressDialog。但是我该怎么做呢?

我的服务是这样的:

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;
          }      

    }

}

当然,这段代码会产生问题,我如何才能获得启动服务的 Activity 的上下文?

对话框应该显示在启动服务的 Activity 中,直到应用程序连接。

最佳答案

所以服务不是您必须使用观察者模式的 UI。您的 Activity 必须在服务中注册一个监听器,以便服务可以通知 Activity 发生特殊事件(例如开始加载或完成加载)。

您必须将以下接口(interface)添加到您的服务类中:

    public interface serviceObserver {
        public void startLoading();
        public void stopLoading();
    }

您的 Activity 必须实现 serviceObserver。您的服务必须存储在 Activity 中创建的 serviceObserver 的实例。 如果您的服务在没有您的 Activity 的情况下运行,我建议使用广播接收器进行通信。

关于android - 在服务类中显示 ProgressDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13347253/

相关文章:

java - fragment 、AsyncTask 和监听器

android-service - 在没有 UI 的情况下在后台运行 Activity

android - 停止前台行为和通知

android - 即使在 Android 中调用 onDestroy 方法后服务也不会停止

android - 恢复 UploadTask 导致 E/StorageException : BufferedInputStream is closed

java - 如何在 Android 中创建需要上下文的单例?

java - Android 菜单在错误的地方膨胀

java - 当JSON文件没有任何且只有获取对象时如何创建数组

java - 如何在 AsyncTask 或 RequestHandler.java 中添加基本身份验证 java android?

android - 如何使用 Intent 将 HashMap 值发送到另一个 Activity