从 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());
);
【问题讨论】:
可能autocompleteTV
是null
。您如何在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的主要内容,如果未能解决你的问题,请参考以下文章