2015-09-30 2 views
0

Я пытаюсь выполнить вход в систему с помощью ASP.Net Web Api в приложение для Android.
Что я до сих пор работаю, так это то, что я хочу сделать запрос для входа в систему синхронным, а не асинхронным. Я использую Android Asynchronous Http Client, как они говорят на своем сайте.Возврат к функции вызова при завершении HTTP-запроса

public class ApiInterface { 
    public static final String ApiURL = "http://******/api/"; 

    private static AsyncHttpClient client = new AsyncHttpClient(); 

    public static void get4Login(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) { 
     client.get(getAbsoluteUrl(url), params, responseHandler); 
    } 

    private static String getAbsoluteUrl(String relativeUrl) { 
     return ApiURL + relativeUrl; 
    } 
} 

И я эту функцию в LoginActivity:

private boolean doLogIn(String user, String pass) { 
    boolean result = false; 

    if (user.trim().isEmpty() || pass.trim().isEmpty()) { 
     return false; 
    } 
    RequestParams params = new RequestParams(); 
    params.add("user", user); 
    params.add("pass", pass); 

    ApiInterface.get4Login("Auth", params, new TextHttpResponseHandler() { 
     @Override 
     public void onFailure(int statusCode, Header[] headers, String responseString, Throwable error) { 
      Toast.makeText(MyApp.getContext(), "Error: " + error.getMessage(), Toast.LENGTH_LONG).show(); 
     } 

     @Override 
     public void onSuccess(int statusCode, Header[] headers, String responseString) { 
      //***Here I want to set the doLogIn() function result depending on the response from the server;*** 
      Toast.makeText(MyApp.getContext(), "Lista sesizari incarcata!", Toast.LENGTH_LONG).show(); 
     } 
    }); 

    return result; 
} 

Есть ли способ сделать это?

+0

Вы должны использовать интерфейс для возврата обратного вызова к родителю – Emil

ответ

0

На вашем MyTextHttpResponseHandler класс должен определить именованный результат переменной и задать тип булево, по умолчанию ложным, а затем определить метод, чтобы получить значение результата, как public boolean getResult(){return this.result;} , то вы можете изменить значение result на onSuccess и onFailure метод , Следующий ваш метод doLogIn понравится

private boolean doLogIn(String user, String pass) { 
//boolean result = false; 

if (user.trim().isEmpty() || pass.trim().isEmpty()) { 
    return false; 
} 
RequestParams params = new RequestParams(); 
params.add("user", user); 
params.add("pass", pass); 
MyTextHttpResponseHandler myTextHttpResponseHandler = new MyTextHttpResponseHandler(this); 
ApiInterface.get4Login("Auth", params, myTextHttpResponseHandler); 
return myTextHttpResponseHandler.getResult(); 
} 
+0

функцию ** возвращение myTextHttpResponseHandler.getResult(); ** выполняется до OnSuccess метода. –

+0

О, да, но я не предлагаю использовать синхронный метод для публикации сетевого запроса (вы знаете причину), так как вы хотите узнать результат запроса, возможно, вы хотите, чтобы результат вызывал метод под названием «A (boolean) ', поэтому для достижения цели вы можете позволить' doLogIn' возвращать void, и когда ваш textHttpResponseHandler вызывается 'onSuccess' или' onFailure', вызывается 'A (boolean)' с результатом (если вызывается 'onSuccess', тогда вызов 'A (true)', иначе, если 'onFailure' вызывает' A (false) ') – starkshang

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