如何从不同的类"#34; AsyncTask doInBackground中输出结果"到#34; MainActivity中的TextView"

时间:2016-05-05 13:51:11

标签: android web-services callback textview

我是android新手。这个问题是我在尝试Android应用程序和Web服务的步骤中的一个阶段。我之前问过一个问题,就在这里:Fail to connect android to web service。 以下是我的更新代码, 我在MainActivity中的代码:

public class MainActivity extends AppCompatActivity {
    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.textView1);
        Mytask mt = new Mytask();
        mt.execute();


    }

}

Mytask中的代码:

public class Mytask extends AsyncTask<String, Integer, String> {

    private static final String SOAP_ACTION = "http://services.aonaware.com/webservices/Define";
    private static final String URL = "http://services.aonaware.com/DictService/DictService.asmx";
    private static final String METHOD_NAME = "Define";
    private static final String NAMESPACE =  "http://services.aonaware.com/webservices/";

    String resultData=null;


    @Override
    protected String doInBackground(String... params) {
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
        PropertyInfo property = new PropertyInfo();
        property.setName("word");
        property.setType(String.class);
        property.setValue("computer");
        request.addProperty(property);
        Log.i("soap tobe", "----");
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        Object response = null;
        try {
            androidHttpTransport.getServiceConnection();
            try {
                androidHttpTransport.call(SOAP_ACTION, envelope);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (XmlPullParserException e) {
                e.printStackTrace();
            }
            Log.i("soap passed", "----"+response);
            response =  envelope.getResponse();
            resultData= response.toString();

        } catch (Exception e) {
            e.printStackTrace();
        }
        Log.i("result passed", "----"+response.toString());

        return resultData;
    }
    protected void onPostExecute(String result) {
        Log.i("onPost passed", "----"+result);
    }

}

我在&#34; onPost传递了#34;登录。从这里开始,如何将结果放入MainActivity中的TextView?

1 个答案:

答案 0 :(得分:1)

您需要使用界面

1。)在asyncTask类中创建接口类。

www.

2。)并将接口AsyncResponse声明为asyncTask类中的字段:

public interface AsyncResponse {
    void processFinish(String output);
}

3.。)在您的主Activity中,您需要实现AsyncResponse接口。

public class MyAsyncTask extends AsyncTask{
  public AsyncResponse delegate = null;
@Override
protected void onPostExecute(String result) {
  delegate.processFinish(result);
}
 }

修改

public class MainActivity implements AsyncResponse{
  MyAsyncTask asyncTask =new MyAsyncTask();



@Override
  public void onCreate(Bundle savedInstanceState) {

 //this to set delegate/listener back to this class
 asyncTask.delegate = (MyAsyncTask)this;

 //execute the async task 
 asyncTask.execute();
  }



//this override the implemented method from asyncTask
  void processFinish(String output){
     //Here you will receive the result fired from async class 
     //of onPostExecute(result) method.
   }
 }

活动代码

public class Mytask extends AsyncTask<String, Integer, String> {

    private static final String SOAP_ACTION = "http://services.aonaware.com/webservices/Define";
    private static final String URL = "http://services.aonaware.com/DictService/DictService.asmx";
    private static final String METHOD_NAME = "Define";
    private static final String NAMESPACE =  "http://services.aonaware.com/webservices/";

    String resultData=null;
    public AsyncResponse delegate = null;


    @Override
    protected String doInBackground(String... params) {
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
        PropertyInfo property = new PropertyInfo();
        property.setName("word");
        property.setType(String.class);
        property.setValue("computer");
        request.addProperty(property);
        Log.i("soap tobe", "----");
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        Object response = null;
        try {
            androidHttpTransport.getServiceConnection();
            try {
                androidHttpTransport.call(SOAP_ACTION, envelope);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (XmlPullParserException e) {
                e.printStackTrace();
            }
            Log.i("soap passed", "----"+response);
            response =  envelope.getResponse();
            resultData= response.toString();

        } catch (Exception e) {
            e.printStackTrace();
        }
        Log.i("result passed", "----"+response.toString());

        return resultData;
    }

    protected void onPostExecute(String result) {
        Log.i("onPost passed", "----"+result);
        delegate.processFinish(result);

    }

    public interface AsyncResponse {
        void processFinish(String output);
    }

}