我有A类和B类.A类在这里调用B类:
public void onClick(View v){
//respond to clicks
new MyTask().execute();
在这个新任务中,我做了一些网络垃圾,最后找到了一个我希望传回A类的字符串。
但我似乎无法做到。我尝试做类似classA.textfield.setText(text)的操作,但是没有用。而且看起来类也无法返回值。我已经看到一些标记为相似的东西,但我不认为它们可以解决我的问题,如果他们这样做,我不明白如何实现它们。我觉得这必须有一个非常简单的方法来做到这一点,但我见过的唯一的事情就是声音甚至远远相似的是制作A级的新版本,但这听起来非常错误......
答案 0 :(得分:2)
这是Callback
或ActionListener
编码模式显示其强度的地方。
在MyTask类中,在类声明后添加:
public interface MyTaskActionListener{
public void didFinish(String result);
}
将成员添加到MyTask类:
private MyTaskActionListener listener;
现在,向MyTask添加方法setActionListener
:
public void setActionListener(MyTaskActionListener l){
listener = l;
}
接下来,在启动MyTask之前,设置监听器:
MyTask task = new MyTask();
task.setActionListener(new MyTaskActionListener(){
public void didFinish(String result){
yoirTextView.setText(result);
}
});
最后但并非最不重要的是,在MyTask的onPostExecute中调用didFinish():
protected void onPostExecute(String result){
listener.didFinish(result);
}
答案 1 :(得分:0)
在B类中创建一个方法,允许您修改textfield并在类B对象上调用该方法(您应该将textfield声明为数据成员) 否则,您可以将textfield的可见性(必须声明为数据成员)设置为public,这是一种不好的做法
答案 2 :(得分:0)
你应该在你的班级做一个建设者,如下所示:
public class MyTask extends AsyncTask<Void, Void, String> {
TextView textView;
public MyTask(TextView tv) {
this.textView = tv;
}
@Override
protected String doInBackground(Void... params) {
// TODO Auto-generated method stub
return null;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
textView.setText(result);
}
}
正如您所看到的,您在onPostExecute方法中更改了TextView的值。
你可以从以下任何地方调用它:
new MyTask(tv).execute();
希望有助于。
答案 3 :(得分:-1)
使用监听器接口。
public interface CompleteListener{
public void onComplete(String result);
}
public class A implements CompleteListener{
public void onComplete(String result){
// do something
}
}
public class B extends AsyncTask {
CompleteListener listener;
public B (CompleteListener listener){
this.listener = listener;
}
onPostExecute(String result){
listener.onComplete(result);
}
}