异步任务返回值处理:将无返回值JSON请求方法改为返回布尔值
解决异步请求返回布尔值给Activity的问题
嘿,这个问题我熟!因为网络请求是异步执行的,你没法直接让getData()返回布尔值——方法会在请求还没完成的时候就先返回了,根本拿不到正确的结果。正确的做法是用回调接口来把结果传递回Activity,我给你一步步改:
1. 定义回调接口
首先我们需要一个接口来传递请求结果,让Activity实现这个接口就能拿到布尔值:
public interface OnDataFetchListener { void onDataFetchResult(boolean isSuccess); }
2. 修改Async类的getData方法
把原来的void方法改成接收回调接口作为参数,然后在网络请求的回调里触发这个接口的方法:
public class Async extends AbstractService { // 把getData改成带回调参数的方法 public void getData(final Context context, final OnDataFetchListener listener) { JSONObject param = new JSONObject(); try { param.put("field_1", "1"); param.put("field_2", "2"); // 注意你原来的代码里重复put了field_3,我改成field_2了 param.put("field_3", "3"); } catch (Exception e) { e.printStackTrace(); // 如果参数构建失败,直接回调失败 if (listener != null) { listener.onDataFetchResult(false); } return; } requester = new HttpRequestController().sendPost("auth/device", param, new HttpRequestController.CallBack() { @Override public void onSuccess(JSONObject response) { // 这里根据你的业务逻辑判断请求是否成功,比如检查返回码 boolean isSuccess = true; // 替换成你的实际判断逻辑 if (listener != null) { listener.onDataFetchResult(isSuccess); } } @Override public void onFailure(IOException e) { e.printStackTrace(); if (listener != null) { listener.onDataFetchResult(false); } } }); } }
3. 在Activity中调用并接收结果
让你的Activity实现OnDataFetchListener接口,然后调用getData()时传入this:
public class YourActivity extends AppCompatActivity implements OnDataFetchListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout); // 调用Async的getData方法 new Async().getData(this, this); } @Override public void onDataFetchResult(boolean isSuccess) { // 这里拿到布尔值,做你需要的操作 if (isSuccess) { // 请求成功的逻辑 } else { // 请求失败的逻辑 } } }
补充说明
- 记得在网络请求的
onSuccess里根据实际返回的JSON数据判断请求是否真正成功(比如检查返回的code字段),不要直接返回true。 - 要处理
listener为空的情况,避免空指针异常。 - 原来的代码里重复put了
field_3,我改成了field_2,你可以根据实际需求调整。
内容的提问来源于stack exchange,提问作者Alexandre C. do Carmo
相关产品推荐
相关产品推荐

