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



我是Android和Java的新手。我一直在Android Studio中进行一个项目,在该项目中,我正在使用Asynctask来提取用户的位置,并且有一个回电接口以获取位置数据。

我已经研究了有关Asyntask的其他帖子,但是在同一类中也实现了在Main Activitive中触发的异步和界面。但是我的项目有4个不同的类

1)data_extractor:在此asynctask中触发。

2)async_task:asynctask在此处完成。

3)icallback:回电接口。

4)DataCollector:此类已实现ICAllbback接口,并将数据存储在DB中。

我无法在我的datacollector类中获取loc_data。而且iCallback即IS接口正在删除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)
}
}

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

您可以做的是创建一个侦听器界面,该界面将具有一个抽象方法,而Async类完成后将调用该方法。

public interface AsyncTaskCompletedListener{
    void taskCompleted();
}

在您的异构任务中,您还必须注册此活动才能获得回调。因此,最好的方法是在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();
     }
}

将要传递的任何数据传递到任务完成的方法(您必须相应地修改接口)。我只是给你一种通用方法。按照需要进行修改。

最新更新