我是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。
static Context _context = null;
static ICallBackInterface iCallBackInterface;
new IPAsyncTask(iCallBackInterface,_context).execute(struct_data); //fpstruc is class to structure my data
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);
}
}
public interface ICallBackInterface {
void OnApiCallBAckReceived(String loc_data);
}
public class DataCollector implements ICallBackInterface{
Context context;
String data;
@Override
public void OnApiCallBAckReceived(String loc_data) {
Log.d("CallBackData","Location=>"+loc_data)
}
}
答案 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方法的任何数据(您必须相应地修改接口)。我刚给你一个通用的方法。根据需要修改它。