Одним из предложений является обработка этого асинхронного c ответа посредством обратного вызова, который передается в качестве аргумента вашему authenticate
методу. Здесь я использую Java 8 лямбда для этого интерфейса одного метода.
public class MyActivity extends Activity {
public interface AuthCallback {
void onAuthResult(String token);
}
private String authenticate(AuthCallback callback) {
// ...
String responseObjectAccessToken = responseObject.getString("accesstoken");
callback.onAuthResult(responseObjectAccessToken)
// ...
}
public void doSomething(View v) {
authenticate((token) -> {
// do something with token
});
}
// ...
}
Как вы можете видеть, обратный вызов может быть сохранен, если вы хотите:
// ...
AuthCallback cb = new AuthCallback() {
@Override
public void onAuthResult(String token) {
// do something in the view/fragment/activity
}
}
// then pass it as argument
или ваш Класс может реализовать этот интерфейс и передать себя в метод:
public class MyActivity extends Activity implements AuthCallback {
@Override
public void onAuthResult(String token) {
// do something
}
// ...
public void doSomething(View v) {
authenticate(MyActivity.this); // <-- pass itself
}
}
Здесь важно отметить, что работа в сети происходит в отдельном потоке, поэтому, если вы хотите внести некоторые изменения в пользовательский интерфейс после того, как ваш API ответит, вы можете использовать вспомогательный метод runOnUiThread для внесения изменений в основной поток пользовательского интерфейса:
authenticate((token) -> {
runOnUiThread(() -> {
// do something with UI here
})
});