2015-04-28 4 views
2

Я создаю приложение чата 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, весь процесс останавливается, даже не работает.

Благодаря

+1

Можете ли вы опубликовать пример того, что вы пробовали до сих пор/что вы пытаетесь выполнить? – JohannisK

+0

@JohannisK Я включил код. Теперь я хочу строку userList в своей деятельности всякий раз, когда вызывается метод onTextMessage. Будет здорово, если вы сможете указать мне ресурсы, где я могу узнать привязку событий, испускание, подписку и т. Д. – kerry

ответ

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

Вы можете передать «обратный вызов», как конструктор пары или по присваивателю.

Надеюсь, это поможет.

+0

Спасибо человеку! Работал для меня ... – kerry

+0

Не могли бы вы помочь мне в еще одной проблеме? .... Я отредактировал свой вопрос для второй проблемы. – kerry

+0

@kerry, извините, не понимаю проблемы. Вам нужно подождать userList будет инициализирован для использования в onPostExecute? Можете ли вы опубликовать больше кода? Я не могу понять, как работает ваш ProcessLogin. –

2

Вы можете объявить интерфейс где-нибудь, сделать ваш обработчик события принимает экземпляр этого интерфейса, а затем создать анонимный класс, реализующий этот интерфейс, проходя этот экземпляр в регистрации вашего обработчика с источником событий.

Что-то, как показано ниже:

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

Я надеюсь, что вы получили точку.

+0

На самом деле, я совершенно новый для JAVA.Будет ли у вас возможность посмотреть мой код и сообщить мне, как я могу получить список пользователей из метода onTextMessage в своей деятельности где-то в другом месте (если в моей деятельности я запустил connect()? – kerry

Смежные вопросы