#java #android #asynchronous #parse-platform #callback
#java #Android #асинхронный #синтаксический анализ-платформа #обратный вызов
Вопрос:
Я довольно новичок в разработке на Android / Java и использую Parseplatform с открытым исходным кодом в качестве моего внутреннего сервера. Я создал класс для управления объектом синтаксического анализа, и этот объект обновляет свои данные из асинхронного вызова на сервер синтаксического анализа в соответствии с этим кодом.
public class DeviceObject {
private String objectID, deviceName, status;
private ParseGeoPoint location;
int batLevel;
public DeviceObject(){
objectID = null;
deviceName = null;
location = null;
batLevel = 0;
status = null;
}
public void getDeviceLatestData() {
if (objectID != null) {
ParseQuery<ParseObject> query = ParseQuery.getQuery("DeviceData");
query.whereEqualTo("DeviceObjectID", objectID);
query.orderByDescending("createdAt");
query.setLimit(1);
query.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> ParseDeviceList, ParseException e) {
if (e == null) {
if (ParseDeviceList.size() == 0) {
Log.d("debg", "Device not found");
} else {
for (ParseObject ParseDevice : ParseDeviceList) {
status = ParseDevice.getString("Status");
batLevel = ParseDevice.getInt("BatteryLevel");
location = ParseDevice.getParseGeoPoint("Location");
Log.d("debg", "Retrieving: " deviceName);
Log.d("debg", "Status: " status " Battery: " Integer.toString(batLevel));
}
//callback listener to add marker to map
}
} else {
Log.d("debg", "Error: " e.getMessage());
}
}
});
}
}
Итак, я создаю свой объект класса в своей основной деятельности со следующим:
DeviceObject userDevice = new DeviceObject();
userDevice.getDeviceLatestData();
Чего я не могу понять, так это того, как в моей MainActivity я могу получать уведомления / обратный вызов для продолжения отображения информации, которую класс userDevice только что получил с сервера синтаксического анализа.
Я попытался создать интерфейс и добавить прослушиватель, как я видел, однако я не смог добавить прослушиватель внутри функции синтаксического анализа done.
Определение моей основной деятельности таково: обратите внимание, что мне нужен обратный вызов OnMapReadyCallback, поскольку я использую Карты Google
public class MapMainActivity extends AppCompatActivity implements OnMapReadyCallback {
Итак, в заключение я хотел бы добавить что-то к основному действию, чтобы я мог обрабатывать данные, когда они были добавлены в класс из асинхронного вызова.
Ответ №1:
Для чего-то подобного я рекомендую использовать шину событий. Вот ссылка на популярный, с которым я добился успеха в прошлом.
В принципе, у вас будет задействован другой класс, который будет вашей шиной. Ваша активность будет зарегистрирована для определенного события (которое вы создадите, подклассируя соответствующим образом). Ваш асинхронный вызов укажет шине событий запустить это событие, а затем шина сообщит всем подписчикам, включая ваше основное действие, что событие запущено. Именно тогда вы бы вызвали getDeviceLatestData
. Ниже приведены простые фрагменты кода, которые вы можете использовать, но прочитайте документацию по этой шине, чтобы полностью понять это.
Ваше событие:
public static class DataReady Event { /* optional properties */ }
Ваш DeviceObject:
public class DeviceObject {
private String objectID, deviceName, status;
private ParseGeoPoint location;
int batLevel;
public DeviceObject(){
objectID = null;
deviceName = null;
location = null;
batLevel = 0;
status = null;
}
public void getDeviceLatestData() {
if (objectID != null) {
ParseQuery<ParseObject> query = ParseQuery.getQuery("DeviceData");
query.whereEqualTo("DeviceObjectID", objectID);
query.orderByDescending("createdAt");
query.setLimit(1);
query.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> ParseDeviceList, ParseException e) {
if (e == null) {
if (ParseDeviceList.size() == 0) {
Log.d("debg", "Device not found");
} else {
for (ParseObject ParseDevice : ParseDeviceList) {
status = ParseDevice.getString("Status");
batLevel = ParseDevice.getInt("BatteryLevel");
location = ParseDevice.getParseGeoPoint("Location");
Log.d("debg", "Retrieving: " deviceName);
Log.d("debg", "Status: " status " Battery: " Integer.toString(batLevel));
}
//callback listener to add marker to map
EventBus.getDefault().post(new DataReadyEvent());
}
} else {
Log.d("debg", "Error: " e.getMessage());
}
}
});
}
}
Ваш MainActivity:
public class MainActivity {
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
@Subscribe(threadMode = ThreadMode.MAIN) // Seems like you're updating UI, so use the main thread
public void onDataReady(DataReadyEvent event) {
/* Do whatever it is you need to do - remember you can add properties to your event and pull them off here if you need to*/
};
}
Комментарии:
1. Вау, это сработало, и так просто. Я никогда не слышал о eventbus до сегодняшнего дня, он отлично работает. Большое спасибо!
2. @BrentonGray88 Конечно!