Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 具有异步网络请求的登录功能?_Android_Retrofit - Fatal编程技术网

Android 具有异步网络请求的登录功能?

Android 具有异步网络请求的登录功能?,android,retrofit,Android,Retrofit,我正在使用“改造”来进行异步网络请求,我该如何修改处理登录的函数?例如,我目前尝试: public UserAuthResponse Login(String username, String password) { try { Callback<UserAuthResponse> getAuthCallback = new Callback<UserAuthResponse>() { @Override

我正在使用“改造”来进行异步网络请求,我该如何修改处理登录的函数?例如,我目前尝试:

public UserAuthResponse Login(String username, String password) {

    try {

        Callback<UserAuthResponse> getAuthCallback = new Callback<UserAuthResponse>() {

            @Override
            public void failure(RetrofitError arg0) {

                if (arg0 != null) {
                    if (arg0.getMessage() != null
                            && arg0.getMessage().length() > 0) {
                        Log.e("KFF-Retrofit", arg0.getMessage());
                    }
                }

            }

            @Override
            public void success(UserAuthResponse listItem,
                    retrofit.client.Response arg1) {

                Log.e("dg", listItem.getUser().getFirstname());
            }
        };

        service.authUser(username, MD5(password), getAuthCallback);

        return response;

    } catch (RetrofitError e) {

        e.printStackTrace();
        return null;
    }

}
public UserAuthResponse登录(字符串用户名、字符串密码){
试一试{
Callback getAuthCallback=new Callback(){
@凌驾
公共无效失败(错误arg0){
如果(arg0!=null){
如果(arg0.getMessage()!=null
&&arg0.getMessage().length()>0){
Log.e(“KFF改造”,arg0.getMessage());
}
}
}
@凌驾
公共作废成功(UserAuthResponse listItem,
改装.client.Response arg1){
Log.e(“dg”,listItem.getUser().getFirstname());
}
};
authUser(用户名,MD5(密码),getAuthCallback);
返回响应;
}捕捉错误(e){
e、 printStackTrace();
返回null;
}
}
但这是有缺陷的:无法从函数返回“UserAuthResponse”?我怎样才能把结果传回去

似乎我需要对web服务进行同步调用,但随后我遇到了“NetworkOnMainThreadException”


对于这样的事情,最好的做法是什么?很抱歉解释得不好,很难写出正确的单词。

请使用我要说明的这一行

  <uses-permission android:name="android.permission.INTERNET"/>

问题是,当您使用回调作为获取改装结果的手段时,您自动放弃了以内联方式返回响应的可能性。有几种方法可以解决这个问题。我想这取决于你选择哪一个最适合你的设计

您可以决定不使用回调方法并使用改型的内联结果,但是您需要自己处理调度,否则您将遇到NetworkMainThreadException异常,如您所述

您还可以将侦听器传递给您的登录方法。然后,结果回调可以调用此侦听器。如果您试图将改装隐藏在某种服务层后面,并公开一个简单的登录界面,那么这可能很有用

interface OnLoginListener {
    onLoginSuccessful(UserAuthResponse response);
    onLoginFailed(Throwable t);
}

public void Login(String username, String password, final OnLoginListener listener) {
    Callback<UserAuthResponse> getAuthCallback = new Callback<UserAuthResponse>() {
                @Override
                public void failure(RetrofitError e) {
                    // You can handle Retrofit exception or simply pass them down to the listener as is
                    listener.onLoginFailed(e);
                }

                @Override
                public void success(UserAuthResponse listItem,
                        retrofit.client.Response arg1) {
                    // handle successful case here and pass down the data to the listener
                    listener.onLoginSucessful(listItem);
                }
            };

    service.authUser(username, MD5(password), getAuthCallback);
}
interface OnLoginListener{
onLoginSucessful(UserAuthResponse响应);
仅登录失败(可丢弃t);
}
公共无效登录(字符串用户名、字符串密码、最终OnLoginListener侦听器){
Callback getAuthCallback=new Callback(){
@凌驾
公共无效故障(e错误){
//您可以处理改装异常,也可以按原样将它们传递给侦听器
listener.onLoginFailed(e);
}
@凌驾
公共作废成功(UserAuthResponse listItem,
改装.client.Response arg1){
//在这里处理成功的案例,并将数据传递给侦听器
listener.onLoginSessful(listItem);
}
};
authUser(用户名,MD5(密码),getAuthCallback);
}

我忍不住觉得这个建议只是在“隐藏问题”什么是典型的最佳实现?正是我所采用的,启动登录,分配一个“成功”侦听器,在通过回调收到时显示适当的消息。这个答案是最好的,所以我会接受。
interface OnLoginListener {
    onLoginSuccessful(UserAuthResponse response);
    onLoginFailed(Throwable t);
}

public void Login(String username, String password, final OnLoginListener listener) {
    Callback<UserAuthResponse> getAuthCallback = new Callback<UserAuthResponse>() {
                @Override
                public void failure(RetrofitError e) {
                    // You can handle Retrofit exception or simply pass them down to the listener as is
                    listener.onLoginFailed(e);
                }

                @Override
                public void success(UserAuthResponse listItem,
                        retrofit.client.Response arg1) {
                    // handle successful case here and pass down the data to the listener
                    listener.onLoginSucessful(listItem);
                }
            };

    service.authUser(username, MD5(password), getAuthCallback);
}