2

我正在创建一个 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,整个过程就会停止,甚至连连接都不能工作。

谢谢

4

2 回答 2

2

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

如下所示:

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

我希望你明白了。

于 2015-04-28T08:54:17.960 回答
1

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

您应该使用回调对象。

就像是:

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

你的活动应该实现这个接口。你应该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;
}

您可以将“回调”作为构造函数参数或通过 setter 方法传递。

希望这可以帮助。

于 2015-04-28T09:08:20.080 回答