从非活动类的异步任务中获取结果

时间:2017-11-18 21:16:55

标签: java android asynchronous

我使用异步任务从我的数据库中获取数据。 我有:

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

2 个答案:

答案 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);
}

也许这会有所帮助