在不同类和回调函数中触发的异步任务在不同的类中实现

时间:2017-02-23 05:37:48

标签: java android android-asynctask

我是android和java的新手。我一直在android studio中做一个项目,我正在使用Asynctask来提取用户的位置,并且有一个回调接口来获取位置数据。

我已经查看了关于asyntask的其他帖子,但是在MainActivity中触发了asynctask,并且在同一个类中也实现了接口。 但是我的项目有4个不同的类

1)data_extractor:在此Asynctask中被触发。

2)Async_task:asynctask在这里完成。

3)ICallBack:回拨接口。

4)DataCollector:该类已实现ICallBback接口,它将数据存储在DB中。

我无法在我的datacollector类中获取loc_data。而且ICallBack也是一个接口正在撤销null。

data_extractor.java

static Context _context = null;
static ICallBackInterface iCallBackInterface;
new IPAsyncTask(iCallBackInterface,_context).execute(struct_data); //fpstruc is class to structure my data


   

Async_Task.java

public class Async_Task extends AsyncTask<Struct_Data, Void, String> {
private ICallBackInterface iCallBackInterface;
Context context = null;
String data;
Struct_data data_struct= null;
public Async_Task(ICallBackInterface iCallBackInterface,Context context){
    this.iCallBackInterface=iCallBackInterface;
    this.context=context;
}

@Override
protected String doInBackground(Struct_Data... data_struct1) {
    String res = "GPS Data";
   return res;
}

@Override
protected void onPostExecute(String result) {

    try {
String loc=LocationExtractor.addLocation(context, data_struct); //LocationExtractor is returning value.

iCallBackInterface.OnApiCallBAckReceived(loc);

}
catch(Exception e)
Log.e("Error",e);
}

}


ICallBackInterface

public interface ICallBackInterface {
void OnApiCallBAckReceived(String loc_data);
}


DataCollector.java

public class DataCollector implements ICallBackInterface{

Context context;
String data;

@Override
public void OnApiCallBAckReceived(String loc_data) {
 Log.d("CallBackData","Location=>"+loc_data)
}
}

2 个答案:

答案 0 :(得分:0)

这个LocationExtractor类是什么?
要获取设备当前位置和位置更新,请查看https://developer.android.com/reference/android/location/LocationListener.html

答案 1 :(得分:0)

您可以做的是创建一个Listener接口,该接口将有一个抽象方法,当后台任务完成时,异步类将调用该方法。

public interface AsyncTaskCompletedListener{
    void taskCompleted();
}

在您的asynctask中,您还必须注册此活动才能获得回调。所以最好的方法是在asynctask的构造函数中传递activitie的上下文

现在,在要进行此回调的活动中实现此接口

class MyActivity implements AsyncTaskCompletedListener{
    //your code here
    MyAsyncTask task = new MyAsyncTask(this);

    @Override
    void taskCompleted(){
        //your code
    }
}

在你的asynctask中创建一个AsyncTaskCompletedListener实例并为其赋值传递上下文的值

MyAsyncTask extends AsyncTask<Void,Void,Void>{
     AsyncTaskCompletedListener listener;
     public MyAsyncTask(AsyncTaskCompletedListener listener){
          this.listener = listener;
     }

     @Override
     public Void onPostExecute(){
         this.listener.taskCompleted();
     }

}

传递您想要传递给taskCompleted方法的任何数据(您必须相应地修改接口)。我刚给你一个通用的方法。根据需要修改它。