2017-11-18 14 views
0

私はデータベースからデータを取得するために非同期タスクを使用します。 私が持っている:アクティビティクラスで非同期タスクの結果を取得

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

あなたの言葉は受け入れられませんAsyncTask !!!あなたがメインのUI(インターネットベースの活動) に多くの作業を行うにはしたくない場所

AsyncTaskが使用されていますが、このアクションは、ブロックあなたのメインスレッドをことを言っています!

あなたの問題は、あなたのAsyncTaskがその仕事で失敗してもあなたのコードに他の場所があると思いますが、あなたのメインUIを壊したりブロックしたりすることはありません。

また、使用している場合.get(); AsyncTaskがそうそこにその仕事を終えるまであなたが実際にメインスレッドがその作業を停止伝える多分2エ​​ラー

の1- asynctask仕事がメインスレッド上

2 - あまりにも多くの仕事を終えたことがないので、メインスレッド上であまりにも多くの仕事asynctaskジョブは長いプロセスであるためです。代わりにGET()使用この能力の

@Override 
protected void onPostExecute(String result) { 
     jsonData = result; 
    } 
+0

を助けるあなたが欲しい今までどこにそれを実装し、そのインターフェイスのコールバック

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

から結果を取得し、あなたのAsynctaskクラスのインタフェースを定義することができますあなたのコードには他に "あなたが後で言うように、問題はAsyncTaskが終了するまでメインスレッドをブロックする' get() 'を呼び出すことにあります。 –

+0

これは、開発者がそれを使用するために提供されていますが、これを行うべきではありませんが、get()を使わないように、より速くジョブを実行するための並列タスクを使用します。 –

0

アンAsyncTaskは長い時間がかかるタスクを実行する新しいスレッドを作成します。このスレッドを開始するには、​​を呼び出します。ただし、タスクが完了するのを待つget()をすぐに呼び出します。これは、最初の場所でAsyncTaskを使用するという点全体を完全に破壊します。

代わりにget()への呼び出しを削除し、onPostExecute()で最終処理を行う必要があります。あなたはこの方法であなたが望むものを何でもすることができます。何らかの方法でアクティビティを使用する必要はありません。他のクラスにデータを提供することができます。

+0

あなたは言った: "それはあなたが望むなら、他のクラスにデータを提供することができます"ので、私はどのようにonPostExecuteから他の新しいアクティビティクラスにデータを提供できますか? – grap

+0

「新しいアクティビティクラスではない」とはどういう意味ですか?あなたはそのデータで何をしたいですか? –

0

あなたは多分これは私があなたの問題がいくつかの場所だと思う」

関連する問題