简体   繁体   中英

asynctask does not execute onPostExecute()

I'm trying to access a web service using ksoap2 inside an asynctask. I wrote this code:

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {

private final String NAMESPACE = "http://eko.erdem.com";
private final String URL = "http://159.20.89.38:9398/EkoBiletTest/services/EkoClass?wsdl";
private final String SOAP_ACTION = "http://eko.erdem.com/homePage";
private final String METHOD_NAME = "homePage";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    hotelNetwork task = new hotelNetwork();
    task.execute(new String[]{NAMESPACE, URL, SOAP_ACTION, METHOD_NAME});
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

private class hotelNetwork extends AsyncTask<String[], Void, String> {



    @Override
    protected String doInBackground(String[]... params) {

        String[] data = params[0];
        String namespace = data[0];
        String url = data[1];
        String action = data[2];
        String method = data[3];

        String result = "";
        SoapObject request = new SoapObject(namespace, method); 

        String place = "Paris";
        String checkinDate = "2013-06-10";
        String checkoutDate = "2013-06-12";

      //Pass value for place variable of the web service
        PropertyInfo placeProp =new PropertyInfo();
        placeProp.setName("place");//Define the variable name in the web service method
        placeProp.setValue(place);//Define value for place variable
        placeProp.setType(String.class);//Define the type of the variable
        request.addProperty(placeProp);//Pass properties to the variable

      //Pass value for checkinDate variable of the web service
        PropertyInfo checkinDateProp =new PropertyInfo();
        checkinDateProp.setName("checkinDate");
        checkinDateProp.setValue(checkinDate);
        checkinDateProp.setType(String.class);
        request.addProperty(checkinDateProp);


      //Pass value for checkinDate variable of the web service
        PropertyInfo checkoutDateProp =new PropertyInfo();
        checkoutDateProp.setName("checkoutDate");
        checkoutDateProp.setValue(checkoutDate);
        checkoutDateProp.setType(String.class);
        request.addProperty(checkoutDateProp);



        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(url);

        try {
            androidHttpTransport.call(action, envelope);
            SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
            result = response.toString();



        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    @Override
    protected void onPostExecute(String result){

        TextView tv = (TextView) MainActivity.this.findViewById(R.id.textView);
        tv.setText(result);
        MainActivity.this.setContentView(tv);
    }




}
}

The textView still showes the default text "Hello World" when I ran the app instead of the response from the web service. I debugged it and saw that the doinBackground method actually gets the response and returns it but the onPostExecute is not called. What may be the cause of this? I heard that this might be caused by an exception in the doinBackground method but it does not show an exception. Any help would be appreciated.

Remove MainActivity.this.setContentView(tv); basically what you are doing is creating the default view again that says "Hello World" after you already set the new text

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM