对于我的应用程序,我需要从我们的服务器联系我们的API,它返回一些JSON.
下载JSON时,它应显示进度条.
我想我应该AsyncTask
在进行网络操作时使用Android 来处理GUI,所以我在我的内容中写了以下内容Activity
:
class DownloadManager extends AsyncTask{ @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)
我需要的范围内:
如果下载成功,请打开新意图.
如果下载失败,请保持相同的活动并显示错误吐司.
代码为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>() { @Override public void onCompleted(Exception e, Response 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>() { @Override public void onCompleted(Exception e, Response 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, Responseresponse); } /** * 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 >() { @Override public void onCompleted(Exception e, Response 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, Responseresponse) { if (response != null) { if (response.getHeaders().code() == 200) { //SUCCESS !! Open new intent! } else { //FAIL!! Show TOAST! } }
});