2013-05-03 3 views
1

Я использую parse.com в качестве моего бэкэнд-сервиса для своего приложения для Android. Я хочу сделать разделение между моими действиями и синтаксическим разбором, для этой цели я создал класс обслуживания, который объединит действия и разбор (бэкэнд). Большинство функций синтаксического анализа являются асинхронными, и я не знаю, как их обрабатывать. Например, если я хочу войти в систему с пользователем, я вызову объект службы, который должен выполнить логин с функцией логического входа. Так вот мой код в деятельности:Звонок на асинхронную функцию

LoginService login = new LoginService("username", "password"); 
login.login(); 
//from here it is not correct 
if(login.getLoginStatus() == 2) { 
    //user loggedin 
}... 

и мой код обслуживание:

public LoginSrvice(String userName, String pass) 
    { 
     this.userName = userName; 
     this.pass = pass; 
    } 

    public void loginUser() 
    { 
     ParseUser.logInInBackground(userName, pass, new LogInCallback() 
     { 

      @Override 
      public void done(ParseUser user, ParseException e) { 
       if (user != null) { 
         logedIn = 1; 
       } else { 
         logedIn = 2; 
       } 
      } 
     }); 
    } 

    public int getLoginStatus() 
    { 
     return logedIn; 
    } 

Мой вопрос, как я должен это делать правильно? как я могу удержать как действия, так и службы, разделенные, но все еще жду ответ в действии, пока класс службы не получит ответ от анализа. Спасибо за помощь!

ответ

1

Ну, я не разработчик Android, но на Java вы можете использовать методы wait() notifiy() объектов для ожидания, пока что-то не произойдет. Но учтите, что вы можете войти в состояние гонки, где вы ждете() после того, как уведомление уже вызвано.

+0

Не могли бы вы дать мне пример, пожалуйста? – vlio20

+1

В этой записи: http://stackoverflow.com/questions/7713786/java-make-a-method-wait-for-a-response-of-another-process/7713815#7713815 вы найдете образец. Как я уже сказал, является общей процедурой в Java –

1

Если жизненный цикл службы не привязан к вашей деятельности, вы можете bind to it, а затем get a reference to the Service via the Binder object. Самый простой способ связи - использовать объект Messenger способом, аналогичным this project.

В данном конкретном случае я предполагаю, что вы ждете входа, прежде чем пользователь сможет использовать что-либо, кроме экрана входа. Вероятно, вы могли бы выполнить логин в AsyncTask или, что еще лучше, модель Fragment/Loader. В соответствующем методе обратного вызова вы должны выполнить действие после входа.

+0

мой класс обслуживания не является классом услуг Android, это всего лишь некоторый буфер между активностью и методами анализа. Я не мог найти решение в сети. AsyncTask хорош только для одной задачи, мне может понадобиться позже, чтобы вызывать больше одной задачи из моей службы, скажем, все угнетения CRUD. Если есть какое-то решение, я был бы благодарен! – vlio20

1

У меня был очень похожий вопрос, но для Parse и iOS. Я разместил вопрос here на SO вместе с ответом, который я нашел. Вы, вероятно, обнаружите, что пишите Cloud Code в JavaScript для Parse. Для этого вам нужно научиться использовать обещания. Моим решением для управления асинхронностью в iOS было выполнение обещаний в iOS. Они позволили мне инкапсулировать мои операции с парсом в очень чистом виде. Такой же трюк может сработать для вас.

Возможно, что код, который я отправил в GitHub, поможет, но он находится в Objective-C.

-Bob

1

Я не ясно, почему вам нужна абстракция вокруг API Parse, но я бы рекомендовал что-то очень простое. API-интерфейс Parse уже обрабатывает безопасность потоков, поэтому вы можете написать свой интерфейс для запроса состояния анализа и KISS. То есть

class UserAbstraction { 
    // You may find it useful to also use the callback object for other reasons. 
    public static void logIn(string userName, string password) { 
    ParseUser.logInInBackground(userName, password); 
    } 

    public static boolean isLoggedIn() { 
    return ParseUser.getCurrentUser() == null; 
    } 
} 
+0

Мне нужно это, чтобы отделить действия от вызовов бэкэнда, может быть, завтра я изменю свой бэкэнд-провайдер. – vlio20

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