Android: получить результат от обратного вызова (сеть KOUSH ION)

Для моего приложения мне нужно связаться с нашим API с нашего сервера, который возвращает некоторый JSON.

При загрузке JSON он должен отображать индикатор прогресса.

Я полагал, что я должен использовать AsyncTask от Android для обработки графического интерфейса при выполнении сетевых операций, поэтому в своей работе я написал следующее:

  class DownloadManager extends AsyncTask<String, Void, Boolean> { @Override protected void onPreExecute() { super.onPreExecute(); mLoadingSpinner.setVisibility(View.VISIBLE); } @Override protected Boolean doInBackground(String... params) { String id = params[0]; downloadUtility.getId(id); return true; } @Override protected void onPostExecute(Boolean result) { super.onPostExecute(result); mLoadingSpinner.setVisibility(View.INVISIBLE); } } 

В основном, onPreExecute показывает onPreExecute , doInBackGround загружает некоторые JSON, а onPostExecute останавливает счетчик.

Вопрос в том, что в downloadUtility.getId(id) мне нужно:

  1. Откройте новое намерение, если загрузка выполнена успешно .
  2. Оставайтесь на том же самом мероприятии и покажите ошибку тоста, если загрузка не удалась .

Код для getId :

 public Future getId(final String id) { // set url String url = IPAddress.PRODUCTION + Variables.get_id+ id; downloading = Ion.with(context) .load("GET", url) .asJsonObject() .withResponse() .setCallback(new FutureCallback<Response<JsonObject>>() { @Override public void onCompleted(Exception e, Response<JsonObject> response) { //try catch here for null getHeaders if (response != null) { if (response.getHeaders().code() == 200) { //SUCCESS !! Open new intent! } else { //FAIL!! Show TOAST! } } } }); return downloading; } 

Как вы можете видеть, я возвращаю будущий объект. Как узнать из будущего объекта, если onCompleted (void) либо дал успех, либо провалился, поэтому я могу обработать результат (успех: открыть новое намерение, неудачно: тост) в asynctask?

    Здесь вы запускаете одну асинтезу в другой asyctask, это не так, как вы можете вызвать ваш метод getId непосредственно в своей деятельности, для него не потребуется другая асинтеза, потому что следующий код сам является асинтетической.

      downloading = Ion.with(context) .load("GET", url) .asJsonObject() .withResponse() .setCallback(new FutureCallback<Response<JsonObject>>() { @Override public void onCompleted(Exception e, Response<JsonObject> response) { //try catch here for null getHeaders if (response != null) { if (response.getHeaders().code() == 200) { //SUCCESS !! Open new intent! } else { //FAIL!! Show TOAST! } } } }); 

    // Добавить новый ответ

    Если вы хотите отделить весь код загрузки от своей активности, вы можете создать собственный callBack в своем загрузочном классе Utility. Он будет действовать как коммуникатор между активностью и вашим классом Download. Я просто даю способ выполнить эту задачу ниже.

    Шрифты класса DownloadUtility выглядят как рев

     public class DownloadUtility { //DO Your all other Stuff /** * Custom Callback */ public interface customCallBack { void onCompleted(Exception e, Response<JsonObject> response); } /** * Your getID code * * @param context * @param id * @param mLoadingSpinner * @param callBack */ public static void getId(Activity context,final String id, Spinner mLoadingSpinner, final customCallBack callBack) { // set url mLoadingSpinner.setVisibility(View.VISIBLE); String url = IPAddress.PRODUCTION + Variables.get_id + id; downloading = Ion.with(context) .load("GET", url) .asJsonObject() .withResponse() .setCallback(new FutureCallback<Response<JsonObject>>() { @Override public void onCompleted(Exception e, Response<JsonObject> response) { mLoadingSpinner.setVisibility(View.GONE); if(callBack != null) callBack.onCompleted(e,response); } } }); } 

    }

    Сделать звонок по вашей деятельности

     DownloadUtility.getId(this, "ID", spinnerObj, new DownloadUtility.customCallBack() { @Override public void onCompleted(Exception e, Response<JsonObject> response) { if (response != null) { if (response.getHeaders().code() == 200) { //SUCCESS !! Open new intent! } else { //FAIL!! Show TOAST! } } 

    });

    Я не думаю, что вам нужна AsyncTask для работы в сети, потому что ваша ионная библиотека уже использует asynctask внутри. Вы можете сделать это

     mLoadingSpinner.setVisibility(View.VISIBLE); downloading = Ion.with(context) .load("GET", url) .asJsonObject() .withResponse() .setCallback(new FutureCallback<Response<JsonObject>>() { @Override public void onCompleted(Exception e, Response<JsonObject> response) { //try catch here for null getHeaders if (response != null) { if (response.getHeaders().code() == 200) { //SUCCESS !! Open new intent! mLoadingSpinner.setVisibility(View.INVISIBLE); } else { mLoadingSpinner.setVisibility(View.INVISIBLE); } } } }); return downloading; 

    Дайте мне знать, если какая-то проблема.

    На мой взгляд, самым чистым решением является создание сервиса, который обрабатывает грязную логику загрузки и возвращает будущее вашего настраиваемого класса ответа, содержащего информацию о успехе и объект json.

     // in eg JsonResponse.java public class JsonResponse() { public boolean ok; public JsonObject json; } // in Service.java public Future<JsonResponse> getId(final String id) { final SimpleFuture<JsonResponse> jsonFuture = new SimpleFuture<>(); String url = IPAddress.PRODUCTION + Variables.get_id + id; Ion.with(context) .load("GET", url) .asJsonObject() .withResponse() .setCallback(new FutureCallback<Response<JsonObject>>() { @Override public void onCompleted(Exception e, Response<JsonObject> response) { JsonResponse jsonResponse = new JsonResponse(); if (response != null) { if (response.getHeaders().code() != 200) { jsonResponse.ok = false; } else { jsonResponse.ok = true; jsonResponse.json = response.getResult(); } } jsonFuture.setComplete(jsonResponse); } }); return jsonFuture; } // in Activity.java private void loadUser(String userId) { mLoadingSpinner.setVisibility(View.VISIBLE); service.getId(userId) .setCallback(new FutureCallback<JsonResponse>() { // onCompleted is executed on ui thread @Override public void onCompleted(Exception e, JsonResponse jsonResponse) { mLoadingSpinner.setVisibility(View.GONE); if (jsonResponse.ok) { // Show intent using info from jsonResponse.json } else { // Show error toast } } }); }