我使用异步任务从我的数据库中获取数据。 我有:
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
。
答案 0 :(得分:0)
AsyncTask创建一个新线程来执行需要很长时间的任务。您可以通过调用execute()
来启动此主题。但是,您立即调用等待任务完成的get()
。这完全破坏了首先使用AsyncTask的全部意义。
相反,您应该移除对get()
的调用,并在onPostExecute()
中进行最终处理。您可以在此方法中执行任何操作。绝对不要求您以任何方式使用Activity。如果您愿意,可以向其他类提供数据。
答案 1 :(得分:0)
您可以在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);
}
也许这会有所帮助