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

时间:2015-04-28 08:35:50

标签: java android event-handling java-websocket

我正在创建一个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;
}

我有另一个问题。我使用回调获得了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,整个过程就会停止,甚至连接都不起作用。

由于

2 个答案:

答案 0 :(得分:2)

你可以在某个地方声明一个接口,让你的事件处理程序接受这个接口的一个实例,然后创建一个实现这个接口的匿名类,同时在你的处理程序注册事件源时传递该实例。

如下所示:

public class MyClass{ ... ... component.addXXXListener(new EventHandler(new MyInterface() { @Override public void doSomething() { callMethod(); } })); ... ... public void callMethod() { ... ... }

我希望你明白这一点。

答案 1 :(得分:1)

我不确定我是否理解正确。

您应该使用回调对象。

类似的东西:

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

您的活动应该实现此界面。 你的&#34;客户&#34;中应该有MessageProcesor字段。类。 您的代码应如下所示:

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

你可以通过&#34;回调&#34;作为构造函数参数或通过setter方法。

希望这会有所帮助。