This question is reproduced from this question, the code given is a minimalistic example of the problem. In this example, we are consuming the temperature conversion SOAP web service of w3schools, using ksoap2 library:
The problem is that I get a NullPointerException on ed = (EditText) mainActivity.findViewById(R.id.mainActivity_editText1); in MyTask.
I know I can implement the AsyncTask as an inner class but I read that it can be implemented as a separate class, so why this problem.
This application has a main activity named MainActivity. The MainActivity has an onclick-listener method, inside which another activity by the name of SecondActivity is started.
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);
}
}
Then there is a separate AsyncTask class called MyTask. We provide a constructor of MyTask for assigning an activity (an instance of MainActivity here) passed to it to an activity object we are creating inside MyTask called mainActivity, the reason for which is to invoke Activity's method findViewById.
From the SecondActivity, we create an object of MyTask using that constructor and passing to it an instance of the main activity in our app; and then call execute on that MyTask object.
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();
}
}
Now inside MyTask, I am reading an EditText from the main activity. Then using it as a celsius value and adding it to the SOAP request to call the web service. Then in the end I am displaying the result from the web service in a TextView in the SecondActivity in onPostExecute.
MyTask.java:
public class MyTask extends AsyncTask<Void, Void, String> {
Activity mainActivity;
EditText ed;
TextView tv;
String searchString;
private static final String TAG = MyTask.class.getSimpleName();
public static final String SOAP_ACTION = "http://www.w3schools.com/webservices/CelsiusToFahrenheit";
public static final String METHOD_NAME ="CelsiusToFahrenheit";
public static final String URL = "http://www.w3schools.com/webservices/tempconvert.asmx";
public static final String NAMESPACE = "http://www.w3schools.com/webservices/";
MyTask(Activity activity) {
mainActivity = activity;
}
@Override
protected void onPreExecute() {
if (mainActivity!=null) {
ed = (EditText) mainActivity.findViewById(R.id.mainActivity_editText1);
} else {
Log.i(TAG, "mainActivity is null.");
}
searchString = ed.getText().toString();
}
@Override
protected String doInBackground(Void... params) {
SoapObject requestSoapObject = new SoapObject(NAMESPACE, METHOD_NAME);
requestSoapObject.addProperty("Celsius", searchString);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(requestSoapObject);
HttpTransportSE htse = new HttpTransportSE(URL);
SoapPrimitive webServiceResultSoapPrimitive = null;
try {
htse.call(SOAP_ACTION, envelope);
webServiceResultSoapPrimitive = (SoapPrimitive) envelope.getResponse();
} catch (HttpResponseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return webServiceResultSoapPrimitive.toString();
}
@Override
protected void onPostExecute (String webServiceResultString) {
System.out.println("Sysout : " + webServiceResultString);
tv = (TextView) mainActivity.findViewById(R.id.secondActivity_textView1);
tv.setText("Fahrenheit : " + webServiceResultString);
}
}