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



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

感谢

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

如下所示:

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

我希望你明白了。

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

您应该使用回调对象。

类似于:

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

您可以将"callback"作为构造函数参数或通过setter方法传递。

希望这能有所帮助。

相关内容

  • 没有找到相关文章

最新更新