Java Android从第二个类调用类函数
如何从类#B调用类#a中定义的函数?类#B扩展了AsynchTask并从web服务获取远程数据。类#我试图从类#B调用的函数用于发送检索到的远程数据以供类#A显示 我正试图使用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 =
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);