[英]get result from async task in not activity class
我使用异步任务从数据库中获取数据。 我有 :
public class BackgroundDatabaseTask extends AsyncTask<String, Void, String> {
String jsonData;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... values) {
String jsonData = Driver.returnJsonDataFromDatabase(values[0]);
return jsonData;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String result) {
jsonData = result;
}
}
在其他课程中,我将其用作:
private static String returnJsonDataBackgroundTaskExecute(String fromWhichTableGetData) {
try {
return new BackgroundDatabaseTask().execute(fromWhichTableGetData).get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
return "Error in BackgroundDatabaseTask";
}
但是get()
阻塞了我的主线程。 那么,如何在其他非活动类中获得异步任务的结果? 我想在非活动类中运行此类,因此我的类没有onCreate方法,但是我的MainActivity类具有活动。
更新:现在我使用线程解决了这个问题,但这是一个很好的解决方案?
Runnable runnable = new Runnable() {
@Override
public void run() {
listOfDataFromDatabase = GetterDataFromDatabase.returnJsonDataBackgroundTaskExecute(tableNameFromWhichIGetData);
}
};
Thread thread = new Thread(runnable);
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
现在我可以通过其他方法访问这个可变的listOfDataFromDatabase
。
AsyncTask创建一个新线程来执行需要很长时间的任务。 您可以通过调用execute()
启动此线程。 但是,您立即调用get()
,它等待任务完成。 首先,这完全破坏了使用AsyncTask的整个目的。
相反,您应该删除对get()
的调用,并在onPostExecute()
进行最后处理。 您可以使用此方法做任何您想做的事情。 绝对不要求您以任何方式使用活动。 您可以根据需要将数据提供给其他类。
您可以在Asynctask类中定义一个接口,然后在任何需要的地方实现它,并从该接口回调中获取结果。
MyTask extends AsynTask{
public interface DataListener{
void onDataReceived(String result);
}
/// then on your onPostExecute method , get an instance of the interface then push the result to the interface method
dataListener.onDataReceived(result);
}
也许这会有所帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.