2016-08-21 8 views
0

提供されているGoogleのサンプルコードに基づいて、Wi-Fi経由で直接サービス検索を使用するアンドロイドアプリを開発していますが、固定値を取得できません私は最終的なハッシュマップを使用していますが、最初の値を格納するためにグローバルに宣言された最後のハッシュマップを使用していても、ハッシュマップはonDnsSdTxtRecordAvailableコールバックが呼び出されるたびに変更されます。 nullに置き換えられました。ここで私が使用しているコードです。ありがとうアンドロイドの最終ハッシュマップで固定値を取得できません

private WifiP2pManager manager; 

     private final IntentFilter intentFilter = new IntentFilter(); 
     private Channel channel; 
     private BroadcastReceiver receiver = null; 
     private WifiP2pDnsSdServiceRequest serviceRequest; 
     private TextView statusTxtView; 
     private TextView services; 
     private Button register; 
     private Button broadcast; 
     private LocationManager locationManager; 
     final HashMap<String, String> buddies = new HashMap<String, String>(); 
     private TextView locationTxt; 
     public String value1; 
     private Button loc; 
     private final String name = new String(); 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      statusTxtView = (TextView) findViewById(R.id.status); 
      services = (TextView) findViewById(R.id.services); 
      register = (Button) findViewById(R.id.discover); 
      broadcast = (Button) findViewById(R.id.bd); 
      locationTxt = (TextView)findViewById(R.id.location); 

      loc = (Button)findViewById(R.id.loc); 
      intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION); 
      intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); 
      intentFilter 
        .addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION); 
      intentFilter 
        .addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION); 

      manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE); 
      channel = manager.initialize(this, getMainLooper(), null); 
      startRegistrationAndDiscovery(); 
      register.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        startRegistrationAndDiscovery(); 
       } 
      }); 

      broadcast.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        discoverService(); 
       } 
      }); 

      loc.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        doIt(); 
       } 
      }); 


     } 


@Override 
     public void onResume() { 
      super.onResume(); 
      receiver = new MyReceiver(manager, channel, this); 
      registerReceiver(receiver, intentFilter); 
     } 

     @Override 
     public void onPause() { 
      super.onPause(); 
      unregisterReceiver(receiver); 
     } 

     public void appendStatus(String status) { 
      String current = statusTxtView.getText().toString(); 
      statusTxtView.setText(current + "\n" + status); 
     } 

     //service discvery handllng methods 
     private void startRegistrationAndDiscovery() { 
      Map<String, String> record = new HashMap<String, String>(); 
      record.put(TXTRECORD_PROP_AVAILABLE, "visible"); 
      WifiP2pDnsSdServiceInfo service = WifiP2pDnsSdServiceInfo.newInstance(
        SERVICE_INSTANCE, SERVICE_REG_TYPE, record); 
      manager.addLocalService(channel, service, new ActionListener() { 

       @Override 
       public void onSuccess() { 
        appendStatus("Added Local Service"); 
       } 

       @Override 
       public void onFailure(int error) { 
        appendStatus("Failed to add a service"); 
       } 
      }); 

      discoverService(); 

     } 

     private void discoverService() { 
      /* 
      * Register listeners for DNS-SD services. These are callbacks invoked 
      * by the system when a service is actually discovered. 
      */ 

      manager.setDnsSdResponseListeners(channel, 
        new DnsSdServiceResponseListener() { 

         @Override 
         public void onDnsSdServiceAvailable(String instanceName, 
                  String registrationType, WifiP2pDevice srcDevice) { 

          // A service has been discovered. Is this our app? 

          if (instanceName.equalsIgnoreCase(SERVICE_INSTANCE)) { 

           // update the UI and add the item the discovered 
           // device. 

            /* WiFiP2pService service = new WiFiP2pService(); 
            service.device = srcDevice; 
            service.instanceName = instanceName; 
            service.serviceRegistrationType = registrationType;*/ 
           //put data to textview here 
           services.setText(srcDevice.status+" Instance name " + instanceName + " type " + registrationType); 
           Log.d(TAG, "onBonjourServiceAvailable " 
             + instanceName); 
           Http_client http_client = new Http_client(SERVICE_INSTANCE); 
           appendStatus("data sent to server successfully"); 


          } 

         } 
        }, new DnsSdTxtRecordListener() { 

         /** 
         * A new TXT record is available. Pick up the advertised 
         * buddy name. 
         */ 
         @Override 
         public void onDnsSdTxtRecordAvailable(String fullDomainName, Map<String, String> record,WifiP2pDevice device) { 
          Log.d(TAG, device.deviceName + " is " + record.get(TXTRECORD_PROP_AVAILABLE)); 
          buddies.put("mm",record.get(TXTRECORD_PROP_AVAILABLE)); 

          Toast.makeText(getBaseContext(),record.get(TXTRECORD_PROP_AVAILABLE),Toast.LENGTH_LONG).show(); 
          // 
         } 
        }); 

      // After attaching listeners, create a service request and initiate 
      // discovery. 
      serviceRequest = WifiP2pDnsSdServiceRequest.newInstance(); 
      manager.addServiceRequest(channel, serviceRequest, 
        new ActionListener() { 

         @Override 
         public void onSuccess() { 
          appendStatus("Added service discovery request"); 
         } 

         @Override 
         public void onFailure(int arg0) { 
          appendStatus("Failed adding service discovery request"); 
         } 
        }); 
      manager.discoverServices(channel, new ActionListener() { 

       @Override 
       public void onSuccess() { 
        appendStatus("Service discovery initiated"); 
       } 

       @Override 
       public void onFailure(int arg0) { 
        appendStatus("Service discovery failed"); 

       } 
      }); 
     } 
     public void doIt(){ 
      buddies.put("mm","value1"); 
      Toast.makeText(getBaseContext(),buddies.get("mm"),Toast.LENGTH_LONG).show(); 
      buddies.put("mm","value2"); 
      Toast.makeText(getBaseContext(),buddies.get("mm"),Toast.LENGTH_LONG).show(); 

     } 
+0

最後のハッシュマップ変数バディは、変数バディが別のハッシュマップを指すことはできないが、ハッシュマップ内の値はいつでも変更できます。 – lionscribe

+0

最初の値がnullに置き換えられ、最初の値を後で使用するために保存する必要があるため、最初に取得する値を修正できます –

答えて

1

私がコメントしたように、最終的な変数はあなたを助けません。あなたの質問に基づいて、あなたがしなければならないことは、返された新しい変数を保存する前に、ハッシュマップに値が設定されているかどうかを常に確認することです。何かのように

if (!buddies.containKey("mm")) 
    buddies.put("mm", .....) 
+0

私の人生を保存してくれてありがとう –

関連する問題