Android AsyncTask不是内部类:奇怪的NullPointerException

时间:2014-11-26 14:50:20

标签: android soap android-asynctask nullpointerexception ksoap2

此问题从this question转载,给出的代码是问题的简约示例。在此示例中,我们使用ksoap2库消费temperature conversion SOAP web service of w3schools

问题是我在MyTask中的ed = (EditText) mainActivity.findViewById(R.id.mainActivity_editText1);上遇到了NullPointerException。 我知道我可以将AsyncTask实现为内部类,但我读到它可以作为一个单独的类实现,所以为什么会出现这个问题。

此应用程序有一个名为MainActivity的主要活动。 MainActivity有一个onclick-listener方法,在其中启动名为SecondActivity的另一个活动。

MainActivity.java:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void StartSecondActivity(View v) {
        Intent intent = new Intent(this, SecondActivity.class);
        startActivity(intent);
    }
}

然后有一个名为AsyncTask的单独MyTask类。我们提供了MyTask的构造函数,用于将传递给它的活动(此处为MainActivity的实例)分配给我们在MyTask内创建的活动对象mainActivity,原因在于为此调用Activity的方法findViewById

SecondActivity,我们使用该构造函数创建一个MyTask对象,并在其应用程序中传递一个主要活动的实例;然后在MyTask对象上调用execute。

SecondActivity.java:

public class SecondActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        new MyTask(new MainActivity()).execute();
    }
}

现在在MyTask内,我正在从主要活动中读取EditText。然后将其用作celsius值并将其添加到SOAP请求以调用Web服务。最后,我将在TextView SecondActivity的{​​{1}}中显示来自网络服务的结果。

MyTask.java:

onPostExecute

1 个答案:

答案 0 :(得分:2)

Pedro中提到的his comment您不想尝试按照您的方式实例Activity

您需要做的就是将值从第一个传递到第二个Activity。然后,您可以将该值传递给AsyncTask的构造函数。

因此,在第一个onClick()的{​​{1}}中,您将其作为Activity传递。

Extra

然后检索它并将其传递给任务

public void StartSecondActivity(View v) {
    Intent intent = new Intent(this, SecondActivity.class);
    EditText et = (EditText) findViewById(R.id.mainActivity_editText1);
    String temp = et.getText().toString();
    intent.putExtra("temp", temp);
    startActivity(intent);
}

现在将其纳入您的任务

public class SecondActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // get the String
        Intent i = getIntent();
        String temp = i.getStringExtra("temp");
        setContentView(R.layout.activity_second);

        // and pass it here
        new MyTask(temp).execute();
    }
}