此问题从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
答案 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();
}
}