Я создаю приложение чата Android, в котором я использую WebSockets, и, кроме того, я хочу создать пользовательскую реализацию протокола приложения.JAVA: Как прослушивать вызов обработчика события/Как получить возвращенный результат обработчика события?
Я застреваю в ситуации.
По сути, я хочу, чтобы узнать, что метод обработчика событий был вызван в другом классе, запустите мой собственный метод в моем классе на основе этого, а затем получите результат этого метода обработчика событий в моем классе ,
Как это возможно?
Я много исследовал и нашел что-то вроде привязки, излучателей событий и т. Д. Может ли кто-нибудь указать мне в правильном направлении и предоставить некоторые ресурсы, откуда я могу узнать эту технику?
Это то, что я сделал до сих пор:
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;
}
Я хочу USERLIST в postExecute, так что я могу отправить этот USERLIST на другой вид деятельности. Как остановить doinbackground(), чтобы дождаться завершения обратного вызова. Если я использую thread.sleep, весь процесс останавливается, даже не работает.
Благодаря
Можете ли вы опубликовать пример того, что вы пробовали до сих пор/что вы пытаетесь выполнить? – JohannisK
@JohannisK Я включил код. Теперь я хочу строку userList в своей деятельности всякий раз, когда вызывается метод onTextMessage. Будет здорово, если вы сможете указать мне ресурсы, где я могу узнать привязку событий, испускание, подписку и т. Д. – kerry