Java MVP(Android)中的Presenter对象获取空对象引用错误

Java MVP(Android)中的Presenter对象获取空对象引用错误,java,android,callback,mvp,Java,Android,Callback,Mvp,我正在使用MVP。我的活动包含一个列表视图。我正在活动的on Create方法中初始化presenter,然后使用该presenter对象调用接口方法以获取数据并设置listview适配器 我的问题是,当presenter对象在任何onClick侦听器中使用时,它都能正常工作,但当我直接使用它时,它会在presenter对象上产生NullPointerException 以下是我的代码片段: 这是我的活动:- public class EmployeeListActivity extends A

我正在使用MVP。我的活动包含一个列表视图。我正在活动的on Create方法中初始化presenter,然后使用该presenter对象调用接口方法以获取数据并设置listview适配器

我的问题是,当presenter对象在任何onClick侦听器中使用时,它都能正常工作,但当我直接使用它时,它会在presenter对象上产生NullPointerException

以下是我的代码片段:

这是我的活动:-

public class EmployeeListActivity extends AppCompatActivity implements EmployeeContract.View {

private static final String TAG = EmployeeListActivity.class.getSimpleName();
private ListView listView;
private EmployeeContract.GetPresenter presenter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_employee_list);

    presenter = new EmployeePresenter(this);    //--> Presenter inialization
}

@Override
public void initView() {
    try {
        listView = findViewById(R.id.listview);
        presenter.getEmployees(listView);     //--> interface method calling (Here I got exception.)

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                presenter.listViewClick(position);    //--> Same thing working perfectly here
            }
        });

    } catch (Exception e) {
        e.printStackTrace();
        String methodName = Thread.currentThread().getStackTrace()[2].getMethodName();
        ErrorLog.saveLog(getBaseContext(), TAG, methodName, e.getMessage(), String.valueOf(e.getCause()));
    }
}

@Override
protected void onResume() {
    super.onResume();
    presenter = new EmployeePresenter(this);
}
公共类EmployeeListActivity扩展AppCompatActivity实现EmployeeContract.View{
私有静态最终字符串标记=EmployeeListActivity.class.getSimpleName();
私有列表视图列表视图;
private EmployeeContract.GetPresenter presenter;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u employee\u list);
演示者=新员工演示者(此);//-->演示者初始化
}
@凌驾
公共视图(){
试一试{
listView=findViewById(R.id.listView);
getEmployees(listView);//-->接口方法调用(这里我遇到了异常。)
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
presenter.listViewClick(位置);//-->同样的东西在这里工作得很好
}
});
}捕获(例外e){
e、 printStackTrace();
String methodName=Thread.currentThread().getStackTrace()[2].getMethodName();
ErrorLog.saveLog(getBaseContext()、标记、方法名、e.getMessage()、String.valueOf(e.getCause());
}
}
@凌驾
受保护的void onResume(){
super.onResume();
演示者=新员工演示者(此);
}
}

我们将感谢您的帮助。先谢谢你

已更新 这是我的错误日志
01-29 16:11:54.709 28540-28540/com.example.myfirstexamplemvp W/System.err:java.lang.NullPointerException:尝试在空对象引用上调用接口方法'void com.example.myfirstexamplemvp.contract.EmployeeContract$GetPresenter.getEmployees(android.widget.ListView)'
01-29 16:11:54.709 28540-28540/com.example.myfirstexamplemvp W/System.err:at com.example.myfirstexamplemvp.view.EmployeeListActivity.initView(EmployeeListActivity.java:35)
01-29 16:11:54.709 28540-28540/com.example.myfirstexamplemvp W/System.err:at com.example.myfirstexamplemvp.presenter.EmployeePresenter.initPresenter(EmployeePresenter.java:40)
01-29 16:11:54.709 28540-28540/com.example.myfirstexamplemvp W/System.err:at com.example.myfirstexamplemvp.presenter.EmployeePresenter.(EmployeePresenter.java:34)
01-29 16:11:54.709 28540-28540/com.example.myfirstexamplemvp W/System.err:at com.example.myfirstexamplemvp.view.EmployeeListActivity.onCreate(EmployeeListActivity.java:28)
01-29 16:11:54.709 28540-28540/com.example.myfirstexamplemvp W/System.err:at-android.app.Activity.performCreate(Activity.java:6582)
01-29 16:11:54.709 28540-28540/com.example.myfirstexamplemvp W/System.err:at-android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1113)
01-29 16:11:54.709 28540-28540/com.example.myfirstexamplemvp W/System.err:at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2532)
01-29 16:11:54.709 28540-28540/com.example.myfirstexamplemvp W/System.err:at-android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2667)
01-29 16:11:54.709 28540-28540/com.example.myfirstexamplemvp W/System.err:at-android.app.ActivityThread.-wrap11(ActivityThread.java)
01-29 16:11:54.709 28540-28540/com.example.myfirstexamplemvp W/System.err:at-android.app.ActivityThread$H.handleMessage(ActivityThread.java:1494)
01-29 16:11:54.709 28540-28540/com.example.myfirstexamplemvp W/System.err:at-android.os.Handler.dispatchMessage(Handler.java:111)
01-29 16:11:54.709 28540-28540/com.example.myfirstexamplemvpw/System.err:at-android.os.Looper.loop(Looper.java:207)
01-29 16:11:54.710 28540-28540/com.example.myfirstexamplemvp W/System.err:at-android.app.ActivityThread.main(ActivityThread.java:5776)
01-29 16:11:54.710 28540-28540/com.example.myfirstexamplemvp W/System.err:at java.lang.reflect.Method.invoke(本机方法)
01-29 16:11:54.710 28540-28540/com.example.myfirstexamplemvp W/System.err:at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
01-29 16:11:54.710 28540-28540/com.example.myfirstexamplemvp W/System.err:at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

以下是我的演示者:-

public class EmployeePresenter implements EmployeeContract.AddPresenter, EmployeeContract.GetPresenter, EmployeeContract.EditPresenter {

private EmployeeContract.View view;
AddEmployeeModel model;
SqliteController controller;

public EmployeePresenter(EmployeeContract.View view) {
    this.view = view;
    initPresenter();
}

private void initPresenter() {
    model = new AddEmployeeModel();
    controller = new SqliteController((Context) view);
    view.initView();
}

@Override
public void getEmployees(final ListView listView) {

    List<AddEmployeeModel> list = controller.getEmployeeList();

    ArrayList<String> empname = new ArrayList<String>();

    if (list.size() > 0) {
        for (int i = 0; i < list.size(); i++) {
            empname.add(list.get(i).getFirstName() + " " + list.get(i).getLastName());
        }
        listView.setAdapter(new ArrayAdapter<String>((Context) view, android.R.layout.simple_expandable_list_item_1, empname));
    }
}
公共类EmployeePresenter实现EmployeeContract.AddPresenter、EmployeeContract.GetPresenter、EmployeeContract.EditPresenter{
私人雇员合同。查看;
AddEmployeeModel;
SqliteController;
公共EmployeePresenter(EmployeeContract.View视图){
this.view=视图;
initPresenter();
}
私有void initPresenter(){
模型=新的AddEmployeeModel();
控制器=新的SqliteController((上下文)视图);
initView();
}
@凌驾
public void getEmployees(最终列表视图列表视图){
List=controller.getEmployeeList();
ArrayList empname=新的ArrayList();
如果(list.size()>0){
对于(int i=0;i
}试试这个:

public class EmployeeListActivity extends AppCompatActivity implements EmployeeContract.View {

private static final String TAG = EmployeeListActivity.class.getSimpleName();
private ListView listView;
private EmployeeContract.GetPresenter presenter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_employee_list);

    presenter = new EmployeePresenter(this);
}

@Override
public void initView(List<Employee> employees, Presenter.Callback callback) {
    listView = findViewById(R.id.listview);
    EmployeesAdapter adapter = new EmployeesAdapter(this, employees);
    listView.setAdapter(adapter);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            callback.onClick(position);
        }
    })
}

@Override
protected void onResume() {
    super.onResume();
    //presenter = new EmployeePresenter(this);
}
公共类EmployeeListActivity扩展AppCompatActivity实现EmployeeContract.View{
私有静态最终字符串标记=EmployeeListActivity.class.getSimpleName();
私有列表视图列表视图;
private EmployeeContract.GetPresenter presenter;
@爱
public EmployeePresenter(EmployeeView view) {

    List<Employee> employees = ...; // get the list of employees
    Callback callback = new Callback(){
        void onClick(int position){
            listViewClick(position);
        }
    }
    view.initView(employees, callback);
}


public interface Callback{
    void onClick(int position);
}
public void initView() {
listView = findViewById(R.id.listview);
adapter = new EmployeesAdapter(this, employeesList);
listView.setAdapter(adapter);

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        presenter.listItemWasClicked(position).
    }
})
}
public interface EmployeeData {
void add(Employee employee);
Employee getEmployee(int position);
int getSize();
}
{

//.....adapter methods

@Overrride
public Employee getEmployee(int position){
return myEmployeeList.get(position);
   }
     //.. other methods.
}
   private EmployeeData empData;
    public  EmployeePresenter  (View view,EmployeeData empData){
    this.empData=empData;
    //... other init
    }
 @Override
 public void listItemWasClicked(int position){
 Employee emp=empData.getEmployee(position)
  }
employeePresenter=new EmployeePresenter(this,listAdapter);