onPostExecute()不能使用MainActivity元素

时间:2011-12-19 14:20:36

标签: android android-asynctask

我有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.
    }
}

2 个答案:

答案 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);
        }   
    }
}