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