Android 如何将结果从;AsyncTask doInBackground来自不同的类;至;“MainActivity中的文本视图”;

Android 如何将结果从;AsyncTask doInBackground来自不同的类;至;“MainActivity中的文本视图”;,android,web-services,callback,textview,Android,Web Services,Callback,Textview,我是android新手。这个问题是我尝试android应用程序和web服务的步骤中的一个阶段。我以前问过一个问题,在这里:。 下面是我的更新代码, 我在MainActivity中的代码: public class MainActivity extends AppCompatActivity { TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super

我是android新手。这个问题是我尝试android应用程序和web服务的步骤中的一个阶段。我以前问过一个问题,在这里:。 下面是我的更新代码, 我在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);
    }

}
公共类Mytask扩展了AsyncTask{
私有静态最终字符串SOAP_ACTION=”http://services.aonaware.com/webservices/Define";
私有静态最终字符串URL=”http://services.aonaware.com/DictService/DictService.asmx";
私有静态最终字符串方法\u NAME=“Define”;
私有静态最终字符串命名空间=”http://services.aonaware.com/webservices/";
字符串resultData=null;
@凌驾
受保护的字符串doInBackground(字符串…参数){
SoapObject请求=新的SoapObject(名称空间、方法名称);
PropertyInfo属性=新的PropertyInfo();
设置名称(“单词”);
setType(String.class);
设置值(“计算机”);
请求。添加属性(属性);
Log.i(“soap-tobe”,“---”);
SoapSerializationEnvelope=新的SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(请求);
HttpTransportSE androidHttpTransport=新的HttpTransportSE(URL);
对象响应=null;
试一试{
androidHttpTransport.getServiceConnection();
试一试{
调用(SOAP_操作,信封);
}捕获(IOE异常){
e、 printStackTrace();
}catch(XMLPullParseRexE){
e、 printStackTrace();
}
Log.i(“soap已通过”,“---+响应);
response=envelope.getResponse();
resultData=response.toString();
}捕获(例外e){
e、 printStackTrace();
}
Log.i(“结果已通过”,“----”+response.toString());
返回结果数据;
}
受保护的void onPostExecute(字符串结果){
Log.i(“onPost已通过”,“---+结果);
}
}

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

您需要使用该界面

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

public interface AsyncResponse {
    void processFinish(String output);
}
2.)并将接口AsyncResponse声明为asyncTask类中的字段:

public class MyAsyncTask extends AsyncTask{
  public AsyncResponse delegate = null;
@Override
protected void onPostExecute(String result) {
  delegate.processFinish(result);
}
 }
3.)在主要活动中,您需要实现接口异步响应

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

}

在我看来,答案太复杂了。在我的项目中,我正在使用。只需在你的
onPostExecute
中创建并发布一个新事件,然后在你应用程序的任何地方捕捉它。这是一个伟大的工具,我偶然发现,我很高兴地推荐它继续前进。您创建和发布的
事件可以而且应该是您自己的自定义对象[它可以包含比一两个字符串复杂得多的数据]。@Vucko答案中有什么复杂的地方?坦率地说,这是一种非常普遍的方法,可以在很多地方使用。例如,在使用诸如Eventbus等库时,在活动和片段之间进行通信等始终是一个很好的选择,但只有在充分理解构建概念后才能使用它,否则开发人员将对实际工作方式一无所知。@varunkr我明白你的意思。酷哥:)@Vucko:谢谢你的帮助。您的回答将帮助我以后在使用图书馆发展技能时作为参考。谢谢您的回答。我试图遵循您的代码,但当我尝试实现对MainActivity的AsyncResponse时,显然存在编译错误。可能是因为我在那里有活动吗?你可以参考我的代码,并在那里添加必要的东西,而不是给出一个新的代码。由于我在Mytask类中创建了接口,所以我编写了实现Mytask.AsyncResponse(如果我错了,请纠正我),因此我提前向您表示感谢。现在processFinish方法中有一个编译错误。它说这个方法和另一个冲突。还试图分配较弱的访问权限(“packageLocal”);was'public'@Job我为您添加了代码,只需使用它并告诉我它是否有效!!我现在正试图公开这个方法。通过执行public void processFinish(String output){//这里您将收到从onPostExecute(result)method.tv.setText(output);}@Job的异步类//激发的结果。那么问题是什么呢?
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); 
    }

}