RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 558275
Accepted
sanu
sanu
Asked:2020-08-23 04:05:10 +0000 UTC2020-08-23 04:05:10 +0000 UTC 2020-08-23 04:05:10 +0000 UTC

如何在java中正确实现回调?

  • 772

最近开始自学Android,java其实之前写的都是.js nodeJS,时间久了就习惯js了。

所以,在学习的过程中,我决定写一个单独的类来发送请求,并且作为错误或成功的结果,它会执行我们发送这个请求的类的相应方法.

有一个类MainActivity,通过单击按钮,我们向服务器发送请求并将响应插入到TextView. 现在我已经实现了这样的回调:

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

protected void onCreate(Bundle savedInstanceState) {


sendButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        DoRequestClass doRequestClass = new DoRequestClass(){

                    @Override
                    public void onOK(JSONObject response) {
                        successReq(response);
                    }

                    @Override
                    public void onError(VolleyError error) {
                        errorReq(error);
                    }
                };
            doRequestClass.execute("http://myserver.local", MainActivity.this);
        }
    });


public void successReq(JSONObject response){
    txtDisplay.setText("Response => "+response.toString());
}

public void errorReq(VolleyError error){
    txtDisplay.setText("Error => "+error.toString());
}

// other methods

这样一个抽象类供测试DoRequestClass

public abstract class DoRequestClass implements DoRequestInterface {

    @Override
    public void execute(String url, Context context) {
        RequestQueue queue = Volley.newRequestQueue(context);

        JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                DoRequestClass.this.onOK(response);
            }

        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                DoRequestClass.this.onError(error);
            }

        });

        queue.add(jsObjRequest);
    }
}

带接口DoRequestInterface

interface DoRequestInterface {
    void execute(String url, Context context);

    void onOK(JSONObject response);

    void onError(VolleyError error);
}

上面描述的一切都有效,但是否有可能以某种方式以某种方式传输successReq它errorReq,DoRequestClass就像我们在 上所做的那样javascript,关于我的意思,关于期望的结果,看看我希望它们如何被大致传输:

sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DoRequestClass doRequestClass = new DoRequestClass();
                doRequestClass.setSuccessCallback(successReq);
                doRequestClass.setErrorCallback(errorReq);
                doRequestClass.execute("http://lessons.flexiblejs.ru/test.php", MainActivity.this);
            }
        });

正如您从上面的代码中了解到的,setSuccessCallback这些setErrorCallback方法将告诉类在成功或不成功的请求后执行DoRequestClass哪些类方法。MainActivity

这个或类似的在 javascript 中可以正常工作,但这样的 java 代码将不起作用。问题是如何创造这样或接近它的东西?这有可能吗?最重要的是不要像我的工作示例onOK和onError.

如果可能的话,我请你给出最详细的答案和解释,因为。我对 Java 的了解一点也不多。

java
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Yura Ivanov
    2020-08-23T06:14:20Z2020-08-23T06:14:20Z

    重构:

    主活动.java

    public class MainActivity extends AppCompatActivity implements
        View.OnClickListener,
        Response.Listener<JSONObject>,
        Response.ErrorListener {
    
        protected void onCreate(Bundle savedInstanceState) {
            ((Button)findViewById(R.id.send)).setOnClickListener(this);
        }
    
        @Override 
        public void onClick(View v){
            switch(v.getId()){
                case R.id.send:
                    doRequestClass.execute("http://myserver.local", this, this, this);
                    break;
            }
        }
    
        @Override
        public void onResponse(JSONObject response) {
            txtDisplay.setText("Response => "+response.toString());
        }
    
        @Override
        public void onErrorResponse(VolleyError error) {
            txtDisplay.setText("Error => "+error.toString());
        }
    }
    

    DoRequestClass.java

    public class DoRequestClass {
    
        @Override
        public void execute(String url, Context context, Response.Listener<JSONObject> listener, Response.ErrorListener listenerError) {
            RequestQueue queue = Volley.newRequestQueue(context);
            JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, listener, listenerError);
            queue.add(jsObjRequest);
        }
    }
    

    事实上,你已经复制了接口Response.Listener<JSONObject>和Response.ErrorListener,只是扩展了泛型并将它们合并为一个。在给定的示例中,这根本没有必要。但是,您可以像以前一样实现此接口,例如,处理响应并进一步转发它:

    JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>(){
        @Override
        public void onResponse(JSONObject response) {
            Log.d(TAG, "JSON:"+ response.toString());
            listener.onResponse(response);// listener будет final
        }
    },listenerError);
    

    回调使用它们自己的接口(或多个接口),向其添加执行方法没有多大意义。特别是,execute 可以在一个类中,而 callback 可以在另一个类中。

    ZY 在结果代码中有一个缺陷。您每次都创建一个新的请求队列。你不应该这样做,一个队列对整个应用程序来说就足够了。当您需要多个队列时,没有那么多选项,而且,固定数量不是那么多,例如,当实现多个帐户时,将请求发送到不同队列中的不同服务器......因此,在应用程序类中(例如)值得为队列创建一个单例并从那里获取它。或者制作DoRequestClass(例如,通过调用它RequestManager)一个队列初始化一次的单例......

    ZZY 我还将点击处理程序转移到活动中,这是可选的“味道和颜色”。

    • 5

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5