android - 如何将结果从 "AsyncTask doInBackground from different class"放到 "TextView in MainActivity"

标签 android web-services callback textview

我是安卓新手。这个问题是我尝试使用 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);
    }

}

我在“onPost passed”日志中得到了正确的结果。从这里,如何将结果放入 MainActivity 中的 TextView?

最佳答案

你需要使用接口(interface)

1.) 在您的 asyncTask 类中创建接口(interface)类。

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

2.) 并将接口(interface) AsyncResponse 声明为 asyncTask 类中的一个字段:

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

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

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);
    }

}

和 Activity 代码

public class MainActivity extends AppCompatActivity implements AsyncResponse{
    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.delegate = this;
        mt.execute();
    }

    void processFinish(String output){
        tv.setText(output); 
    }

}

关于android - 如何将结果从 "AsyncTask doInBackground from different class"放到 "TextView in MainActivity",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37052412/

相关文章:

android - StringEntity/string 到 HttpEntity

android - u\2022 不显示在从 json 检索的 TextView 中

安卓屏幕永远不会关闭

Python tkinter 文本修改回调

clojure - 长期运行的递归 Clojure 函数的进度更新

php - Cakephp 的 beforeSave 在使用 saveAll 时不保留新数据?

android - 应用程序 :popupTheme= "@style/AppTheme.PopupOverlay"- Cannot be resolved to a variable

java - 我应该使用什么技术来开发小型 Java webservice?

c# - 在 C# 中通过 Web 服务传输图像的最佳方式是什么?

java - 如何从 session 中作为 JsonNode 访问 | ${user.get()}