【问题标题】:How can I get the Object value from a callback interface?如何从回调接口获取 Object 值?
【发布时间】:2016-02-16 21:24:47
【问题描述】:

第一个问题,我从java编程开始..

我有一个 AssyncTask 方法,它使用一个接口在完成后获取用户信息,该调用来自 OnPostExecute。一切都很好,但是一旦您收到有关我的主要活动的数据,我就无法将用户从 done 方法中提取出来。

我发布代码以便更好地理解。

 new FetchUserDataAsyncTask(user, new GetUserCallBack() {

                @Override
                public void done(User returnedUser) {

                    String usernameRet = returnedUser.username;
                    String passwordRet = returnedUser.password;
                }

            });

和界面:

public interface GetUserCallBack {

    public abstract void done(User returnedUser);
}

异步任务:

public class FetchUserDataAsyncTask extends AsyncTask<Void, Void, User> {

    RequestHandler rh = new RequestHandler();
    User user;
    User ret_user;
    GetUserCallBack usercallback;


    public FetchUserDataAsyncTask(User user, GetUserCallBack usercallback){
        this.user  = user;
        this.usercallback = usercallback;

    }


    @Override
    protected User doInBackground(Void... params) {
        try {
            HashMap<String, String> dataToSend = new HashMap<>();
            dataToSend.put("username", user.username);
            dataToSend.put("password", user.password);
            ret_user = rh.sendGetRequest("www.fjrmy.php", dataToSend);
            return null;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ret_user;
    }

    @Override
    protected void onPostExecute(User returnedUser) {
        super.onPostExecute(ret_user);
        usercallback.done(returnedUser);
    }


}

我只想“提取”usernameRet 和 passwordRet 来使用它们。有可能吗?

非常感谢。

【问题讨论】:

  • 为什么要包含 JavaScript 标记?这是一种完全不同的语言。
  • 发布您的 AsyncTask 代码
  • 在这里查看我的答案stackoverflow.com/a/35210468/2308683
  • @cricket_007 有没有关于如何做的简短解释?这真的很简单,我只想提取返回用户的信息以便在通话中使用它。
  • 你认为return null; 会做什么?

标签: java android interface callback


【解决方案1】:

您的 AsnycTask 始终返回 null。 删除这一行:

 return null;

也不需要在 AsyncTask 中保持返回值。这应该有效:

public class FetchUserDataAsyncTask extends AsyncTask<Void, Void, User> {

    RequestHandler rh = new RequestHandler();
    User user;
    GetUserCallBack usercallback;


    public FetchUserDataAsyncTask(User user, GetUserCallBack usercallback){
        this.user = user;
        this.usercallback = usercallback;

    }


    @Override
    protected User doInBackground(Void... params) {
        try {
            HashMap<String, String> dataToSend = new HashMap<>();
            dataToSend.put("username", user.username);
            dataToSend.put("password", user.password);
            return rh.sendGetRequest("www.fjrmy.php", dataToSend);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(User returnedUser) {
        super.onPostExecute(returnedUser);
        usercallback.done(returnedUser);
    }


}

【讨论】:

    【解决方案2】:

    AsyncTask 中,如果rh.sendGetRequest 方法成功,则在try 块中返回null,将其更改为return ret_user;

    在您的示例代码中,您似乎也没有在 AsyncTask 上调用 execute

    final User user = new User(); <--- declare a field or outer variable
    
    FetchUserDataAsyncTask task = new FetchUserDataAsyncTask(user, new GetUserCallBack() {
          @Override
          public void done(User retUser) {
              user.username = retUser.username; // <--- set variables
              user.password = retUser.password; // <---
          }
    });
    task.execute(); // <----- missing this
    

    【讨论】:

    • 你能帮我解决一下 setName 方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    相关资源
    最近更新 更多