Java Android从第二个类调用类函数

Java Android从第二个类调用类函数,java,android,class,function-calls,Java,Android,Class,Function Calls,如何从类#B调用类#a中定义的函数?类#B扩展了AsynchTask并从web服务获取远程数据。类#我试图从类#B调用的函数用于发送检索到的远程数据以供类#A显示 我正试图使用this将类A的当前实例传递给类B,但这只是传递上下文,因此无法识别函数 我也尝试过使用static,但是当函数运行一个新线程时,将函数定义为static会产生一个编译器错误 我试图调用的代码如下所示: public void test(List<DATA> Data){ this.Data =

如何从类#B调用类#a中定义的函数?类#B扩展了AsynchTask并从web服务获取远程数据。类#我试图从类#B调用的函数用于发送检索到的远程数据以供类#A显示

我正试图使用
this
将类A的当前实例传递给类B,但这只是传递上下文,因此无法识别函数

我也尝试过使用
static
,但是当函数运行一个新线程时,将函数定义为static会产生一个编译器错误

我试图调用的代码如下所示:

public void test(List<DATA> Data){
        this.Data = Data;
        runOnUiThread(new Runnable() {          

            @Override
            public void run() {
                // TODO Auto-generated method stub
                for(DATA data : MainActivity.this.Data){
                    Toast.makeText(MainActivity.this, data.title, Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
公共无效测试(列表数据){
这个。数据=数据;
runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
//TODO自动生成的方法存根
for(数据:MainActivity.this.DATA){
Toast.makeText(MainActivity.this,data.title,Toast.LENGTH_SHORT).show();
}
}
});
}

据我所知,您从一个异步任务B开始,因为在Android中,web抓取只能以异步方式工作。您希望对中的对象可以访问提取结果

A将编写类似这样的代码

public class A extends FragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        TextView fetch = (TextView) findViewById(R.id.fetch);
        new B(getApplicationContext(),fetch).execute();
        // This will update a TextView when fetching is done.
    }
}

public class B extends AsyncTask<Void, Integer, Void> {
    Context c;
    TextView f;
    public B(Context c, TextView f) {
        super();
        this.f = f;
        this.c = c;
    }


    @Override
    protected Void doInBackground(Void... params) {
        // TODO: the fetching: fetch()
        String t = fetch();
        f.setText();
        return null;
    }
}
公共A类扩展了碎片活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
TextView fetch=(TextView)findViewById(R.id.fetch);
新建B(getApplicationContext(),fetch.execute();
//这将在抓取完成时更新TextView。
}
}
公共类B扩展异步任务{
上下文c;
文本视图f;
公共B(上下文c、文本视图f){
超级();
这个。f=f;
这个.c=c;
}
@凌驾
受保护的Void doInBackground(Void…参数){
//TODO:fetching:fetch()
字符串t=fetch();
f、 setText();
返回null;
}
}

您可以使用执行前和执行后方法执行其他技巧。我希望我能帮忙

您可以制作一个界面,即:

public interface RecieveDataDelegate {

    public void receiveData(Object dataFromWebService, boolean success);
}
让Class#A实现接口。从类调用asyncTask时,将自身传递给具有ReceiveDataDelegate类型参数的asyncTask的构造函数

new AsyncTask1 (this).execute();
使用构造函数设置AsyncTask,并将数据发送回类#a onPostExecute(),以便更新ui

 class AsyncTask1 extends AsyncTask<Void, Void, Boolean> {
    Object dataReceived ;
    protected RecieveDataDelegate delegate;

    public AsyncTask1 (RecieveDataDelegate delegate) {
        this.delegate = delegate;
    }
    protected Boolean doInBackground(Void... params) {
      //do your service request and set dataRecieved
    }
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);
        delegate.RecieveDataDelegate (dataReceived, result.booleanValue());
    }
类AsyncTask1扩展了AsyncTask{
接收到的对象数据;
受保护的ReceiveDataDelegate委托;
公共异步任务1(ReceiveDataDelegate委托){
this.delegate=委托;
}
受保护的布尔doInBackground(Void…params){
//执行服务请求并设置已接收的数据
}
受保护的void onPostExecute(布尔结果){
super.onPostExecute(结果);
delegate.receiveDataDelegate(dataReceived,result.booleanValue());
}

这样,任何实现该接口的类都可以使用相同的asyncTask。

这就是您要做的:

在主要活动中:

ClassBAsyncTask mat = new ClassBAsyncTask(this, .., ..);
ClassBAsyncTask的承包商:

public ClassBAsyncTask(MainActivity context, .., ..) {
    mContext = context;
    ....
    ....
}
要从
ClassBAsyncTask
中调用MainActivity的方法
test(List)

((MainActivity)mContext).test(yourListVariable);

查看弱引用,确保当活动不再存在时,
AsyncTask
不会使用
mContext

您不能将相关类导入第一个类吗?我对这句话感到困惑:“我正试图使用此方法将类A的当前实例传递给类B,但这只是传递上下文,因此无法识别函数。“这似乎是错误的。@g00dy:肯定是。但是,我想避免这种情况,以便它可以重复使用。当它获取远程数据时,我想从其他活动调用它。您是否试图从主活动外部调用测试函数?然后将其构建到库中。您还可以如何重复使用它?再次感谢您……噢,加拿大!
public ClassBAsyncTask(MainActivity context, .., ..) {
    mContext = context;
    ....
    ....
}
((MainActivity)mContext).test(yourListVariable);