gpt4 book ai didi

java - 无法在android中的最终hashmap上获得固定值

转载 作者:行者123 更新时间:2023-12-01 09:35:00 26 4
gpt4 key购买 nike

我正在开发一个 Android 应用程序,它使用 wifi direct 上的服务发现,基于提供的 google 示例代码,问题是我无法获得广告 TXT 记录的固定值,即使我使用的是最终的hashmap 来存储值,每次调用 onDnsSdTxtRecordAvailable 回调时都会修改 Hashmap,即使我使用全局声明的最终 hashmap 来存储第一个值,它也会被 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();

}

最佳答案

正如我所评论的,最终变量不会帮助你。根据您的问题,您需要做的是在保存新返回的变量之前始终检查 HashMap 中是否设置了该值。类似的东西

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

关于java - 无法在android中的最终hashmap上获得固定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39061021/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com