Это моя ситуация:

Я хочу, чтобы два класса общались друг с другом. Итак, MainActivity создает новый объект SomeOtherstrangeClass.

public class MainActivity extends AppCompatActivity implements myEventListener {

    private TextView txtHelloSet;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        txtHelloSet = (TextView) findViewById(R.id.txtHello);

        SomeOtherStrangeClass someOtherStrangeClass = new SomeOtherStrangeClass();
    }


    @Override
    public void someEvent(int e) {
        Log.v("[Listener]", "SomeEvent triggered. Number: " + e);
        txtHelloSet.setText("Event came in!");
    }
}

#

public class SomeOtherStrangeClass {

    public  SomeOtherStrangeClass(){

        EventThrower eventThrower = new EventThrower();
        MainActivity mainActivity = new MainActivity();


        eventThrower.addListener(mainActivity);
        Log.v("[Listener]", "Throwing event");


        eventThrower.someEvent(13);

    }
}



interface myEventListener extends java.util.EventListener {
    void someEvent(int e);
}

public class EventThrower {

    private List<myEventListener> listeners = new ArrayList<myEventListener>();


    public void addListener(myEventListener toAdd){
        listeners.add(toAdd);
    }
    public void removeListener(myEventListener toRemove){
        listeners.remove(toRemove);
    }


    public void someEvent(int e){
        for(myEventListener el : listeners)
            el.someEvent(e);
    }

}

Вот как я это делаю. Но проблема в том, что когда генерируется событие, я все еще вызываю метод someEvent, который находится в MainActivity в SomeOtherStrangeClass. Поэтому я не могу изменять какие-либо объекты в MainActivity. Как будто их нет. Я получаю NPE:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference

Почему это так? Есть ли решение для этого?

0
MindCode 25 Фев 2016 в 15:25

2 ответа

Лучший ответ

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

Попробуйте изменить конструктор для SomeOtherStrangeClass следующим образом:

public  SomeOtherStrangeClass(myEventListener listener) {
        EventThrower eventThrower = new EventThrower();
        eventThrower.addListener(listener);
        Log.v("[Listener]", "Throwing event");
        eventThrower.someEvent(13);
    }

Затем в onCreate () вашей активности

SomeOtherStrangeClass someOtherStrangeClass = new SomeOtherStrangeClass(this);
0
bitbybit 25 Фев 2016 в 13:02
MainActivity mainActivity = new MainActivity();

Вы здесь что-то не так делаете. Не предполагается создавать подобные объекты Activity. Вам следует переосмыслить логику вашего приложения.

1
Darish 25 Фев 2016 в 12:33