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);
}