Я пытаюсь реализовать шаблон субъекта / наблюдателя для заполнения 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();
}
}
Я был на этомвесь день, и я изо всех сил пытаюсь понять, как эти интерфейсы функционируют на логическом уровне.Если у кого-то есть светящийся ресурс, которым может следовать манекен, я был бы благодарен.