Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.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
Java 将值从服务异步方法返回到活动_Java_Android_Asynchronous - Fatal编程技术网

Java 将值从服务异步方法返回到活动

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

我有一个服务类,用于使用Volley进行web服务调用:

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