簡體   English   中英

Android:從回調獲得結果(網絡KOUSH ION)

[英]Android: get result from callback (networking KOUSH ION)

對於我的應用程序,我需要從我們的服務器聯系我們的API,它返回一些JSON。

下載JSON時,它應顯示進度條。

我想我應該在進行網絡操作時使用Android的AsyncTask來處理GUI,所以我在我的Activity編寫了以下內容:

 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顯示加載微調器, 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中處理結果(成功:打開新意圖,失敗:toast)?

在這里你運行一個asynctask在另一個asyctask中這不是一個正確的方法你可以直接在你的活動中調用你的getId方法它將不需要另一個asynctask因為下面的代碼它自己asynctask。

 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!
                    }
                }

            }
        });

//添加新答案

如果要從活動中分離整個下載代碼,則可以在下載Utility類中創建自定義callBack。 它將像活動和下載類之間的溝通者。 我只是想在波紋管上完成這項任務。

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 e.g 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
            }
        }
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM