Android, Java - Шаблон наблюдателя с интерфейсами охтп и субъект / наблюдатель - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь реализовать шаблон субъекта / наблюдателя для заполнения ArrayList через сеть, используя okhttp.Я, безусловно, работаю под фундаментальным недоразумением о том, как работают эти интерфейсы, потому что они чувствуют себя как вуду, и я не могу объяснить, как они ДОЛЖНЫ работать, а тем более эффективно устранять неполадки.Я надеюсь на некоторое понимание здесь.

Это 4 части.Два интерфейса (Subject и Observer) и два класса, которые реализуют эти интерфейсы (прошу прощения за использование «Activity». Это не относится к Android Activity. Это автоматизация json to pojo, которую я не исправил) Во-первых, интерфейс Observer:

package come.myapp.app
import java.util.ArrayList;

public interface Observer {
  void onUpdate(ArrayList<Activity> events);
}

Тематический интерфейс:

 package come.myapp.app
 public interface Subject {
        void registerThis(Observer o);
        void unregisterThis (Observer o);
        void sendNotice();
    }

Основной:

package come.myapp.app
//import things

    public class MainActivity extends AppCompatActivity implements Observer {

        private ArrayList <Activity> eventList = new ArrayList<>();

            @Override
        protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         GetOBEvents getOBEvents = new GetOBEvents();
         getOBEvents.registerThis(this);
         getOBEvents.getEvents(); // This is a failure point (null pointer)

        }

Конкретный предмет:

public class GetOBEvents implements Subject
    {
        ArrayList<Activity> eventList = new ArrayList<>();
        ArrayList<Observer> mObservers;
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
        ...//data is taken and processed here

        ArrayList<Activity> eventArray = new ArrayList<>();

        public void getEvents () {
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure ...
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String callResponseText = response.body().string();
                Venues venues = Json.fromJson(callResponseText,Venues.class);
                List<Venue> listhere = venues.getVenues();
                List<Activity> allEvents = listhere.get(0).getActivities();
                for (Activity activity : allEvents) {

                    eventArray.add(activity);} //This works
                    setEvents(eventArray);// This fails with a null point exception

                }

        });

    }
        @Override
        public void registerThis(Observer o) {
            mObservers.add(o);

        }

        @Override
        public void unregisterThis(Observer o) {
            mObservers.remove(o);

        }

        @Override
        public void sendNotice() {
            for (Observer observers : mObservers) {
                observers.onUpdate(eventList);

            }
        }
        public void setEvents(ArrayList<Activity> mEvents){
                eventList = mEvents;
                sendNotice();
            }
    }

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

...