JAVA:如何监听事件处理程序的调用/如何获取事件处理程序的返回结果?

标签 java android event-handling java-websocket

我正在创建一个 Android 聊天应用程序,其中使用 WebSockets,最重要的是我想创建应用程序协议(protocol)的自定义实现。

我陷入了困境。

本质上,我想要的是一种知道事件处理程序方法已在另一个类中被调用的方法,基于该方法在我的类中启动我自己的方法,然后在我的类中获取该事件处理程序方法的结果。

这怎么可能?

我进行了很多研究,发现了诸如绑定(bind)、事件发射器等之类的东西。有人能给我指出正确的方向并提供一些我可以学习这项技术的资源吗?

这是我到目前为止所做的:

public void connect(){

        try {

            setUpWebSocketHandler(handler);
           mConnection.connect(wsuri, handler);

        }
        catch (WebSocketException e) {

           Log.d("exception", e.toString());
        }


}


public void setUpWebSocketHandler(WebSocketHandler handler)
{
    handler = new WebSocketHandler(){

  //first method for websockethandler

        @Override
        public void onOpen() {


            //here i create a json format string to be sent to my         server that returns something afterwards
            String output = json.toString();
            Log.d("OUTPUT+" , output);
            Log.d("onOpen", "Status: Connected to " + wsuri);
            mConnection.sendTextMessage(output);
        }



//second method for websockethandler
        @Override
        public void onTextMessage(final String payload) {

            Log.d("onTextMessage", "Response: " + payload);
            JSONObject jsonObj = null;
            try {
                jsonObj = new JSONObject(payload);
            } catch (JSONException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            try {

                String type = jsonObj.getString("type");
                switch (type) {
                    case "xxx":
                        //authEvent
                        System.out.println("xxx");
                        break;
                    case "yyy":
                        //userOnlineEvent
                        System.out.println("yyy");
                        break;
                    case "zzz":
                        System.out.println("zzz");

                        break;
                    case "userListToken":

                        userList = getUserList(payload);

                        break;


                    default:
                        System.out.println("DefaultCase");
                        break;
                }
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }



        }

//third method for websockethandler

        @Override
        public void onClose(int code, String reason) {
            Log.d("onClose", "Connection lost.");
        }

    };
}



public String getUserList(final String payload)
{
    final Thread connectthread;
    connectthread = new Thread(
            new Runnable()
            {
                public void run()
                {
                    try {
                        //here i create a URL, send post request to it and i get a response with userlist
                        HttpClient client = new DefaultHttpClient();

                        HttpGet post = new HttpGet(url);


                        HttpResponse response = client.execute(post);
                        BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));


                        while ((userList = rd.readLine()) != null) {
                            System.out.println(userList);
                            Log.d("HTTP GET RESPONSE", "Response: " + userList);

                        }



                    } catch (JSONException | IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
    );



    connectthread.start();
    try
    {
        connectthread.join();
    }
    catch (Exception e)
    {
        Log.i("error","Error!!");
    }

    System.out.println("userListToken");
    return userList;
}

我还有一个问题。我使用回调获取了 userList...现在的问题是:

private class ProcessLogin extends AsyncTask<String, Void, String> {
    private ProgressDialog pDialog;
    String uname,password;
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        uname = txtUsername.getText().toString();
        password = txtPassword.getText().toString();

        pDialog = new ProgressDialog(LoginActivity.this);
        pDialog.setTitle("Contacting Servers");
        pDialog.setMessage("Logging in ...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }
    @Override
    protected String doInBackground(String... args) {

        String user = null;

        ifly.connect();


        user = userList;
        return user;
    }
    @Override
    protected void onPostExecute(String user) {
        try {

            if(user != null){






                //Intent i = new Intent("com.example.tabmainactivity");
                Log.d("Got it", "Response: " + userList);
                pDialog.dismiss();
                //startService(new Intent(getApplicationContext(),iFlyChatMessage.class));
                //startActivity(i);
                //finish();

            }else{
                // username / password doesn't match
                pDialog.dismiss();
                Toast.makeText(getApplicationContext(),
                        "Incorrect username/password", Toast.LENGTH_SHORT).show();

            }


        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}


public void processMessage(String userList)
{
       this.userList = userList;
}

我想要 postExecute 中的 userList ,以便我可以将此 userList 发送到另一个 Activity 。我如何停止 doinbackground() 以等待回调完成。如果我使用 thread.sleep,整个过程就会停止,甚至连接也不起作用。

谢谢

最佳答案

您可以在某处声明一个接口(interface),让您的事件处理程序接受此接口(interface)的实例,然后创建一个实现此接口(interface)的匿名类,同时将该实例传递到事件源的处理程序注册中。

如下所示:

公共(public)类 MyClass{ ... ... component.addXXXListener(new EventHandler(new MyInterface() { @覆盖 公共(public)无效doSomething(){ 调用方法(); } })); ... ... 公共(public)无效callMethod(){ ... ... }

我希望你明白了。

关于JAVA:如何监听事件处理程序的调用/如何获取事件处理程序的返回结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29914335/

相关文章:

javascript - 在同一个 javascript 事件处理程序中调用不同的函数

java - Tomcat 8 无法从 Spring Tool Suite 启动 Spring Boot 应用程序

java - 我什么时候需要生成 hibernate 运行时代理?

java - 为什么java常量声明为静态的?

java - 如何用Java制作一个Android倒计时器?

c# - Excel 选择更改事件触发了两次 C#

javascript - 取消绑定(bind)某些类上的点击处理程序

java - 如何正确调整这段代码中的数字?

android - View 与另一个 View 重叠

android - 您的内容必须有一个 id 属性为 'android.r.id.list' 的 ListView