jeudi 10 août 2017

Interface method does not call implemented method in activity from non-activity class

I am implementing Observer design pattern to organize client-server part of my application. I have interface NetworkObserver for handling events in Activities, which awaiting for server data.

public interface NetworkObserver {
   void handleEvent(String response);
}

Also i have concrete MainActivity, which implements interface NetworkObserver. This activity using NetworkWebSocketManager for sending request to server.

public class MainActivity extends AppCompatActivity implements NetworkObserver {
    ...
     public void buttonClicked(View view) {
        // Send request
        NetworkWebSocketManager manager = NetworkWebSocketManager.getInstance();
        manager.addNetworkObserver(this);
        manager.send(Constants.kRouteRegistration, credentials);
    }

    // Interface implementation
    @Override
    public void handleEvent(String response) {
        Log.e("WERBSOCKET", "RESPONSE FOR ACTIVITY " + response);
    }
}

NetworkWebSocketManager is a singleton class, which implements NetworkObservable interface

/**
* Interface for transfering incoming server data to observers
*/
public interface NetworkObservable {
    void addNetworkObserver(NetworkObserver observer);
    void removeNetworkObserver(NetworkObserver observer);
    void notifyNetworkObserver(String response);
}

and manager itself

public class NetworkWebSocketManager implements NetworkObservable {
    private static final NetworkWebSocketManager ourInstance = new NetworkWebSocketManager();
    private ArrayList<NetworkObserver> observers;

    public static NetworkWebSocketManager getInstance() {
       return ourInstance;
    }
    ...
}

This method in NetworkWebSocketManager sending requests to server and receiving data from it. In overrided method onMessage() of WebSocketListener i got answer from server and call notifyNetworkObserver() of interface NetworkObservable, implemented in manager.

public void send(String route, Object params) {
                    ...
                    WebSocket webSocket = client.newWebSocket(request, new WebSocketListener() {
                        @Override
                        public void onOpen(WebSocket webSocket, Response response) {
                            super.onOpen(webSocket, response);
                        }

                        @Override
                        public void onMessage(WebSocket webSocket, String text) {
                            super.onMessage(webSocket, text);      
                            notifyNetworkObserver(text);
                        }

                        @Override
                        public void onFailure(WebSocket webSocket, Throwable t, Response response) {
                           super.onFailure(webSocket, t, response);
                           t.rintStackTrace();
                        }
                    });  
            ...
            webSocket.send(jsonString);
    }

Here is implementation of notifyNetworkObserver() in NetworkWebSocketManager

@Override
public void notifyNetworkObserver(final String response) {
   Log.e("WEBSOCKET", "OBSERVERS COUNT " + observers.size()); // 1 observer

   for(NetworkObserver observer : observers) {
      Log.e("WEBSOCKET", "CURRENT OBSERVER " + observer); // com.example.MainActivity@1b723d05
      observer.handleEvent(response);
   }
}

The problem is observer.handleEvent(response); does not calls handleEvent(), which implemented in MainActivity. I am searched a lot, but i dont understand what's wrong.

Aucun commentaire:

Enregistrer un commentaire