gpt4 book ai didi

java - java中如何让程序等待某个方法

转载 作者:行者123 更新时间:2023-12-02 03:43:16 25 4
gpt4 key购买 nike

我正在编写一个程序,它返回一个字符串数组列表。问题是,当我调用该方法时,列表尚未填充,因此我得到一个空列表。我用线程尝试过,但现在调用该方法时得到 null 引用。顺便说一下,我必须实现一个异步任务,否则在尝试使用 InetAddress 时会出现异常。

private class DeviceManager extends Thread {

private ArrayList<String> deviceList;
private String networkIP;

public DeviceManager(String networkIP) {
this.networkIP = networkIP;
}

public void run() {
getDeviceList();
}

public ArrayList<String> getDeviceList() {
new AsyncTask<Void, Void, Void>() {

@Override
protected Void doInBackground(Void... params) {
try {
deviceList = new ArrayList<String>();
InetAddress address;

Log.i("NetworkIPgetDeviceList", networkIP);

String deviceIP = networkIP;

for (int i = 0; i < 255; i++) {
address = InetAddress.getByName(deviceIP += "" + i);
if (address.isReachable(2000)) {
Log.i("Devicefound", deviceIP);
deviceList.add(deviceIP);
}
deviceIP = networkIP;
}

} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}.execute();
return deviceList;
}

public ArrayList<String> getList() {
return this.deviceList;
}
}

最佳答案

Artur 您在代码中所做的事情是启动一个线程来检索设备列表,然后启动另一个线程(AsyncTask)来实际创 build 备列表。所以你有三个线程同时运行(假设你在 UIThread 中使用 DeviceManager 类)。 getDeviceList() 返回 null 的原因是 AsyncTasks doInBackground 尚未运行来收集您的设备列表,它可能正在等待机会得到安排。因此得出的结论是,您只需要一个线程(UIThread 除外),它可以是 Thread 或 AsyncTask(更可取,因为它可以提供更好的控制),正如 rusted Brain 在他的答案中使用的那样。我更喜欢将 DeviceManager 作为 AsyncTask (只是更简洁一些,如果设备管理器唯一的任务是检索设备列表),如下代码。

在 AsyncTask 中,doInBackground 在后台线程中运行(顾名思义),onPostExecutedoInBackground 之后在 UI 线程上运行

class DeviceManager extends AsyncTask<String, Void, List<String>> {

private ConnectionCompleteListener listener;

public interface ConnectionCompleteListener {
void onSuccess(List<String> deviceList);

// if you need to know reason for failure you can add
// parameter to onFailure
void onFailure();
}

public DeviceManager(ConnectionCompleteListener listener) {
this.listener = listener;
}

@Override
protected List<String> doInBackground(String... params) {
List<String> deviceList = new ArrayList<>();
String networkIP = params[0];
try {
InetAddress address;
Log.i("NetworkIPgetDeviceList", networkIP);

String deviceIP = networkIP;
for (int i = 0; i < 255; i++) {
address = InetAddress.getByName(deviceIP += "" + i);
if (address.isReachable(2000)) {
Log.i("Devicefound", deviceIP);
deviceList.add(deviceIP);
}
deviceIP = networkIP;
}
} catch (IOException e) {
deviceList = null;
e.printStackTrace();
}
return deviceList;
}

@Override
protected void onPostExecute(List<String> deviceList) {
if (deviceList == null) {
this.listener.onFailure();
} else {
this.listener.onSuccess(deviceList);
}
}
}

所以在你的 Activity 中你可以调用

new DeviceManager(new DeviceManager.ConnectionCompleteListener
() {
@Override
public void onSuccess(List<String> deviceList) {

}

@Override
public void onFailure() {

}
}).execute("YOUR_NETWORK_IP");

关于java - java中如何让程序等待某个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36593477/

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