我有doInBackground()
。在函数之后我想在TextView
上更改一些MainActivity
。
但是当我在主要活动上触发该功能时,我在NullPointerException
行上获得了TextView
。
protected String doInBackground(Object... arguments) {
some code..
return result;
}
@Override
protected void onPostExecute(String result) {
if(result!=null)
new MainActivity().setScoreListUpdate(result);
}
MainActivity:
public void setScoreListUpdate(String settings)
{
String[] yeniscore = settings.split("\\|");
if(yeniscore.length > 1)
{
birinci.setText(yeniscore[1]); << NULLPOINTEREXC.
}
}
答案 0 :(得分:2)
这给出NullPointerException
的原因是您创建了MainActivity
的新实例,而不是处理现有实例。
您需要做的是将Activity
的引用传递给AsyncTask
,然后根据该引用调用您的方法。
所以在你的AsyncTask
课程中,你将有一个变量:
private MainActivity myMainActivity;
在AsyncTask
- 类:
public MyAsyncTaskClassName( MainActivity activity ) {
myMainActivity = activity;
}
然后在onPostExecute
中执行:
myMainActivity.setScoreListUpdate(result);
答案 1 :(得分:1)
使用
MainActivity.this.setScoreListUpdate(result);
而不是
new MainActivity().setScoreListUpdate(result);
in yout postExecute
方法。
此外,名为birinci
的TextView应该是MainActivity
类中的字段,而不仅仅是onCreate
方法中的变量。
编辑:在我的程序中它的工作原理如下。看看差异。
public class DeviceSettingsStatsActivity extends ListActivity {
AsyncTask<Void, Integer, ListAdapter> task = null;
ListAdapter listAdapter = null;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
task = new ComputeTask().execute();
}
protected void viewComputeResult(ListAdapter result) {
setListAdapter(result);
}
private class ComputeTask extends AsyncTask<Void, Integer, ListAdapter> {
@Override
protected ListAdapter doInBackground(Void... params) {
// some stuff
}
@Override
protected void onPostExecute(ListAdapter result) {
DeviceSettingsStatsActivity.this.viewComputeResult(result);
}
}
}