如何在Java安卓开发中从callback回调返回String类型的值
问题原因
你拿到null是因为你的网络请求是异步执行的:调用getCurrentDate之后,主线程不会等待后台网络请求完成,会直接返回currentDate的初始空值,直到网络请求成功后onSuccess才会被调用,此时再给currentDate赋值已经晚于return语句的执行了。
正确实现方案
Android中异步任务的结果不能直接用同步返回的方式获取,你只需要把要使用这个日期的业务逻辑,直接放到onSuccess回调中执行即可,onPostExecute本身就是运行在主线程的,所以onSuccess回调也默认在主线程触发,完全符合你的使用需求:
// 不要写同步返回值的getDate方法,直接在需要加载日期的地方调用这个方法 private void loadDate() { InternetDate internetDate = new InternetDate(this); internetDate.getCurrentDate(new InternetDate.OnGetDate() { @Override public void onSuccess(String date) { // 这里已经是主线程,直接用date做你要做的操作即可 // 示例:给页面TextView赋值 // dateText.setText("当前服务器时间:" + date); } }); }
额外注意事项
- 绝对不要为了同步返回值而阻塞主线程等待网络请求完成,会导致页面卡顿甚至触发ANR(应用无响应)报错
- 你现有代码的
InternetDate类里,setDateAndTimeFormat方法用到的mDateAndTimeFormat变量没有定义,需要补充成员变量private String mDateAndTimeFormat;否则会编译错误 - 异常捕获的逻辑最好加个兜底回调,比如在
OnGetDate接口里加个onError(String error)方法,请求失败的时候通知调用方处理异常场景
内容的提问来源于stack exchange,提问作者Kumar Santanu
相关产品推荐
相关产品推荐

