私はデータベースからデータを取得するために非同期タスクを使用します。 私が持っている:アクティビティクラスで非同期タスクの結果を取得
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クラスのインタフェースを定義することができますあなたのコードには他に "あなたが後で言うように、問題はAsyncTaskが終了するまでメインスレッドをブロックする' get() 'を呼び出すことにあります。 –
これは、開発者がそれを使用するために提供されていますが、これを行うべきではありませんが、get()を使わないように、より速くジョブを実行するための並列タスクを使用します。 –