从 onPostExecute 中的另一个类调用方法导致 nullPointerException

Posted

技术标签:

【中文标题】从 onPostExecute 中的另一个类调用方法导致 nullPointerException【英文标题】:Calling method from another class in onPostExecute causing nullPointerException 【发布时间】:2015-03-15 09:58:55 【问题描述】:

这也可能对某人有所帮助:How to get the result of OnPostExecute() to main activity because AsyncTask is a separate class?

我正在从onPostExecute() 中的另一个类调用方法。

我假设 onPostExecute()doInBackground(String... params) 之后被调用,这是正确的,根据文档和调试器。

调用方法:

protected void onPostExecute(String result) 
    CreateHangOut crtHO = new CreateHangOut();
    crtHO.createHangOut(result);

部分方法被调用,导致NPE(方法的第一行):

public void createHangOut(String location) 
    String city=autocompleteTV.getText().toString();
   

自动完成TextView(autocompleteTV) 在活动的创建时被初始化。

这是我如何称呼AsyncTask

create.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            new 
HTTPRequest().execute((autocompleteTV.getText()).toString());
            
    );

调用 onCreate 的方法(点击按钮的活动):

private void initialize() 
    gAPI= new GoogleAPIAutocomplete();
    autocompleteTV = (AutoCompleteTextView) 
    findViewById(R.id.crtHOLocOptionsTV);
    setUpAutocomplete();
    create = (Button) findViewById(R.id.crtHOCreateBtn);
    name =(EditText) findViewById(R.id.crtHONameET);
    create.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            new 
    HTTPRequest().execute((autocompleteTV.getText()).toString());
            
    );

【问题讨论】:

可能autocompleteTVnull。您如何在CreateHangOut 类中访问autocompleteTV autocompleteTv 里面有文字吗? 我认为你是对的,它可能为 null,因为 autocompleteTV 仅在 onCreate 上初始化,但是为什么在我调用 AsyncTask 时它会丢失初始化?请回答我,我会标记为正确的。 @OndrejTokar : why is it losing its initialization when I call AsyncTask 取决于您在 CreateHangOut 中的访问方式 那么crtHO 是你的Activity 吗?您通常(可能永远)不希望以这种方式初始化Activity。 See this answer 从 AsyncTask 更新您的活动 【参考方案1】:

因为createHangOut 方法在CreateHangOut Activity 中,所以如果扩展AsyncTask 类的类是CreateHangOut 的内部类,则无需创建新对象来访问方法只需使用方法名称调用它:

protected void onPostExecute(String result) 
    CreateHangOut.this.createHangOut(result);

【讨论】:

如果AsyncTask在另一个班级怎么办?那么我应该将方法createHangOut(String result) 设为静态吗?但这会导致另一个问题。有什么好的解决方案吗? @OndrejTokar: 如果AsyncTask 在其他类中,则不要调用 Activity 的方法,而是使用类构造函数将 TextView 初始化实例发送到扩展 AsyncTask 的类

以上是关于从 onPostExecute 中的另一个类调用方法导致 nullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

使用 AsyncTask 中的 onPostExecute 方法列表项单击事件调用 Android 中的另一个活动

如何从 C# 中的另一个私有类调用私有类变量

从 UIButton 中的另一个类调用方法

如何从 React.js 中的另一个类组件调用方法

如何从 Python 中的另一个文件调用类方法?

从同一个类中的另一个方法调用 main 方法