Java 将值从服务异步方法返回到活动
我有一个服务类,用于使用Volley进行web服务调用:Java 将值从服务异步方法返回到活动,java,android,asynchronous,Java,Android,Asynchronous,我有一个服务类,用于使用Volley进行web服务调用: public class AccountService { public static void forgotPassword(Context c, String emailAddress) { String url = "myUrl"; JsonArrayRequest request = new JsonArrayRequest(url, new Respon
public class AccountService {
public static void forgotPassword(Context c, String emailAddress) {
String url = "myUrl";
JsonArrayRequest request = new JsonArrayRequest(url,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
// done
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
Volley.newRequestQueue(c).add(request);
}
}
当截击请求完成时,我想更新活动中的UI。考虑到这是一个异步请求,我如何做到这一点?我是否能够在活动中从AccountService类调用方法?感谢您的帮助您必须找到一种方法将后台工作的结果返回到主线程,以便它可以更改视图层次结构。有很多方法可以做到这一点,但大多数都不是很好 但在您这样做之前,您的代码存在问题。首先,如果您认为自己制作了一个Android服务组件,那么实际上您并没有这么做。您创建了一个名为AccountService的类,它在Android世界中没有任何特殊功能 其次,对forgotPassword()的调用不传递任何参数,但AccountService中forgotPassword()的定义具有完全不同的签名。这不会编译
您可能应该开始学习Android特定的异步编程模式,并在编写代码之前制定解决问题的策略,因为你几乎肯定会在不了解自己首先在做什么的情况下出错。将侦听器对象传递给AccountService,然后将通信成功或错误发送给活动 请按照以下步骤进行尝试(您不应将布局传递给AccountService,这将产生一些不必要的问题)
公共类ForgotPasswordActivity扩展了AppCompatActivity
实现View.OnClickListener,
AccountServiceCallback{
私人提交{
AccountService.forgotPassword(“email@123.com",本),;
}
@凌驾
公共void onClick(视图v){
}
@凌驾
公共void onResponse(JSONArray响应){
//根据响应要求更新用户界面
}
@凌驾
public void onErrorResponse(VollyError错误){
//根据响应流更新UI
}
}
公营会计服务{
公共静态无效放弃密码(上下文c、字符串电子邮件、最终
AccountServiceCallback(回调){
字符串url=“myUrl”;
JsonArrayRequest请求=新的JsonArrayRequest(url,
新的Response.Listener(){
@凌驾
公共void onResponse(JSONArray响应){
//完成
onResponse(response);
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
callback.onErrorResponse(错误);
}
});
newRequestQueue(c)、add(request);
}
接口AccountServiceCallback{
公共响应(JSONArray响应);
public void onErrorResponse(VollyError错误);
}
}
谢谢您的回复。为了简单起见,我删减了这个方法;我的代码可以编译。你只是指出了我的代码有什么问题,没有太多关于如何修复它的内容。“有很多方法可以做到这一点”——但你没有列出任何方法。“开始学习Android特定的异步编程”,但没有提供任何资源。你指出我实际上并没有制作一个服务组件——那么,我该怎么做呢?我认为谷歌搜索“android异步编程”将是一个很好的开始。顺便说一句,几乎所有人都希望更多的代码,而不是更少的代码。这是一个非常常见的重复主题。哇,非常简单。非常感谢你的快速回答。将尝试使用onResponse()
调用您的活动方法来更新有关已完成任务的信息!
public class ForgotPasswordActivity extends AppCompatActivity implements View.OnClickListener{
private void submit() {
accountService.forgotPassword();
}
}
public class ForgotPasswordActivity extends AppCompatActivity
implements View.OnClickListener,
AccountServiceCallback{
private void submit() {
AccountService.forgotPassword("email@123.com", this);
}
@Override
public void onClick(View v) {
}
@Override
public void onResponse(JSONArray response) {
// UPDATE UI as per on response requirement
}
@Override
public void onErrorResponse(VollyError error) {
// UPDATE UI as per response flow
}
}
public class AccountService {
public static void forgotPassword(Context c, String email, final
AccountServiceCallback callback) {
String url = "myUrl";
JsonArrayRequest request = new JsonArrayRequest(url,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
// done
callback.onResponse(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callback.onErrorResponse(error);
}
});
Volley.newRequestQueue(c).add(request);
}
interface AccountServiceCallback {
public void onResponse(JSONArray response);
public void onErrorResponse(VollyError error);
}
}