Android 如何将结果从;AsyncTask doInBackground来自不同的类;至;“MainActivity中的文本视图”;
我是android新手。这个问题是我尝试android应用程序和web服务的步骤中的一个阶段。我以前问过一个问题,在这里:。 下面是我的更新代码, 我在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
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);
}
}