2016-10-23 6 views
0

Неслучайно для разработки Android/Java и использования Parseplatform с открытым исходным кодом в качестве моего бэкэнд-сервера. Я создал класс для управления объектом синтаксического анализа, а его данные обновления объекта - из асинхронного вызова на сервер синтаксического анализа в соответствии с этим кодом.Множественные вложенные обратные вызовы от класса Async

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 только что удалил с сервера анализа.

Я попытался создать интерфейс и добавить слушателя в то, что я видел, однако я не мог добавить слушателя внутри выполняемой функции синтаксического анализа.

Определение моей основной деятельности, обратите внимание, мне нужно OnMapReadyCallback, как я использую Google Maps

public class MapMainActivity extends AppCompatActivity implements OnMapReadyCallback { 

Таким образом, в заключение я хотел бы добавить что-то к основному виду деятельности, так что я могу обрабатывать данные, когда он был добавлен в класс из асинхронного вызова.

ответ

1

Для чего-то вроде этого, я рекомендую использовать шину событий. Here is a link to a popular one I've had success with in the past.

В принципе, у вас будет другой класс, который будет вашим автобусом. Ваша деятельность будет регистрироваться для определенного события (которое вы создадите, подклассы, если это необходимо). Ваш асинхронный вызов будет информировать шину событий об отключении этого события, и затем автобус сообщит всем подписчикам, включая ваше основное действие, об этом событии. То есть, когда вы звоните 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*/ 
    }; 
} 
+0

Wow, что работали и так легко. Я никогда не слышал о eventbus до сегодняшнего дня, он отлично работает. Большое спасибо! – BrentonGray88

+0

@ BrentonGray88 уверенный предмет! – kpsharp

Смежные вопросы