Я пишу программу, которая возвращает мне ArrayList of Strings. Проблема в том, что когда я вызываю метод, список еще не заполнен, поэтому я возвращаю пустой список. Я пробовал это с потоком, но теперь я получаю ссылку null
, когда я вызываю метод. Кстати, мне пришлось реализовать задачу async, иначе я получаю исключение при попытке использовать InetAddress
.Как заставить программу ждать метода в java
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;
}
}
Вы должны запустить код, который использует этот список позже в другой задаче синхронизации – Ferrybig
У меня есть опыт работы с C#, и как я помню, был простой способ решить эту проблему, реализовав метод async, но как я знаю, что в java нет эквивалента :( –
Если вы ожидаете завершения задачи async, вы все равно получите то же исключение. Причина, по которой андроид выбрасывает это исключение, заключается в том, что если вы повесите основной поток, ваше приложение будет не отвечать на запросы, что приведет к плохому пользовательскому опыту – Ferrybig