java.lang.NullPointerException:尝试在空对象引用上调用接口方法“接口”

时间:2019-05-03 17:36:42

标签: java android asynchronous interface

我正在尝试将数据从“ asynctask”类发送到mainactivity类,我创建了一个带有函数的接口,该接口由主要活动实现,我的问题是我得到了“ java.lang.NullPointerException:尝试在空对象引用上调用接口方法'void com.example.ascheduler.SpinnerInterface.updateMyText(java.lang.Boolean)' “当我从异步调用

的“ updateMyText”函数时

奇怪的是,我已经设置了另一个界面,并且它工作得很好,我不知道为什么这个界面没有

带有“ processFinish”功能的接口“ AsyncResponse”在调用时可以完美工作,而带有updateMyText功能的“ SpinnerInterface”接口在调用时会给出异常

package com.example.ascheduler;

public interface SpinnerInterface {
         void updateMyText(Boolean yes);
    }


package com.example.ascheduler;

import java.io.IOException;

public interface AsyncResponse {
    void processFinish(String output) throws IOException;

}


public class Async extends AsyncTask<String,Void, String> {
    public AsyncResponse delegate = null;
    public SpinnerInterface updateMyText=null;



    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        updateMyText.updateMyText(false); //this line gives the exception

    }
protected void onPostExecute(String result) {
        try {
            if(result!=null) {
                delegate.processFinish(result);
                updateMyText.updateMyText(true);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


package com.example.ascheduler;
public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener, AsyncResponse,View.OnClickListener,SpinnerInterface {
 @Override
    public void processFinish(String output) throws IOException {
        if (output != null) {
            //do stuff with output
        }
    }

    @Override
    public void updateMyText(Boolean flag) {
        if(flag)
            csSpinner.setVisibility(View.VISIBLE);
        else
            csSpinner.setVisibility(View.INVISIBLE);
    }
}

1 个答案:

答案 0 :(得分:0)

为避免在接口调用时出现空指针异常,您需要将内部接口设置为构造函数中的值,如下所示:

public Async(AsyncResponse delegate,SpinnerInterface updateMyText){
    this.delegate=delegate;
    this.updateMyText=updateMyText;
}

在创建Asyntask时,您将调用此构造函数。另外,您的示例似乎缺少很多代码。请添加所有需要的代码,以便我们更轻松地解决问题。