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

7gs2gvoe  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(1492)

我正在创建一个android聊天应用程序,其中我使用websockets,最重要的是我想创建一个自定义的应用程序协议实现。
我陷入了困境。
从本质上说,我想要的是一种方式来知道一个事件处理程序方法已经在另一个类中被调用,在我的类中基于此启动我自己的方法,然后在我的类中获得该事件处理程序方法的结果。
这怎么可能?
我做了很多研究,发现了绑定、事件发射器等东西。有人能给我指出正确的方向,并提供一些资源让我学习这项技术吗?
这就是我目前所做的:

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

我还有一个问题。我用回调得到了用户列表…现在的问题是:

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发送到另一个活动。如何停止doinbackground()以等待回调完成。如果我使用thread.sleep,整个过程就会停止,甚至连connect都不起作用。
谢谢

vltsax25

vltsax251#

我不确定我是否正确地理解了你。
应该使用回调对象。
比如:

public interface MessageProcesor{
         public void processMessage(String message);
     }

您的活动应该实现此接口。你应该有 MessageProcesor “client”类中的字段。您的代码应该如下所示:

private MessageProcesor callback;

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);
                        callback.processMessage(userList);

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

您可以将“callback”作为构造函数参数或通过setter方法传递。
希望这有帮助。

k3bvogb1

k3bvogb12#

您可以在某处声明一个接口,使事件处理程序接受此接口的示例,然后创建一个实现此接口的匿名类,同时在处理程序的注册中向事件源传递该示例。
如下所示: public class MyClass{ ... ... component.addXXXListener(new EventHandler(new MyInterface() { @Override public void doSomething() { callMethod(); } })); ... ... public void callMethod() { ... ... } 我希望你明白我的意思。

相关问题