0

ServiceAsyncTask を使用して接続を確立するために a を使用したいと考えています。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);

ありがとうございました!

4

1 に答える 1

0

ダウンロードサービスでも同じ問題が発生します。最初は、バインダーのコールバックイベントに応答するための多くの定型コードを含むレイアウトが含まれていました。これで、進行状況を表示する必要がある各アクティビティに追加する自己完結型のフラグメントができました。

于 2012-11-12T15:01:52.963 に答える