2016-09-05 12 views
0

データにアクセスしてAsyncTaskクラス本体外のコンポーネントにバインドする方法を知りたいですか?アンドロイドでAsyncTaskクラスからデータをフェッチする方法は?

私のようなクラスがあります。

class DownloadData extends AsyncTask<String, Void, String> {....} 

を、それは方法があります。

@Override 
protected String doInBackground(String... params) { 

     return ....;//return some data 
    } 

どこに私はdoInBackgroundの戻りデータを理解していませんか?

私は私のクラスを使用する場合、私はそれが好きで使用しているため:

 DownloadData dd = new DownloadData(); 
      dd.execute(...); 

が、私はこのようにそれを使用することができますか?私はいくつかのコンポーネント

 DownloadData dd = new DownloadData(); 
     string temp=dd.doInBackground(...); 
+0

は答えを見て、承認 – Vyacheslav

答えて

3

doInBackground()の後にreturnonPostExecute()に転送されます。あなたはちょうどあなたがあなたのような何かを行うことができ、結果に応じて、あなたの活動のUIを更新できるように、AsyncTaskクラスから結果を返すようにしたい場合はHow to use Async result in UIThread

0

にバインドするために私のメインクラスの外に返されたデータを取得したいので、私は、メインUIから

@Override 
protected String doInBackground(String... params) { 

     return ....;//return some data 
    } 

結果をキャッチすることはできません。

コールバックを使用する必要があります。たとえば、interfaceを使用して結果を取得できます。例えば

インターフェイスを作成します。

public interface IProgress { 
    public void onResult(int result); 
} 

をクラスを作成します:コード内

 private class DownloadData extends AsyncTask<String, Void, String> { 
    private IProgress cb; 
    DownloadData(IProgress progress) { 
    this.cb = cb; 
    } 
@Override 
protected String doInBackground(String... params) { 


for (int i = 0; i < 10; i ++) { 
if (cb!=nil) 
cb.onResult(i);//calls 10 times 
} 
.... 
    } 
... 
    } 

どこか:

DownloadData dd = new DownloadData(new IProgress() { 
public void onResult(int result) { 
/// this is your callback 

//to update mainUI thread use this: 
final res = result; 
runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        //update UI here 
textview.setText("" + res); 
       } 
      }); 

} 
}); 
      dd.execute(...); 

そして、いつものように、あなたがdoInBackground経由した後、UIを更新することができますがonPostExecute()

0

:あなたの活動でそれを使用するには

は、このリンクを参照してください。この:

private AsyncResponse asyncResponse = null; 

public DownloadData(AsyncResponse as) { 
    this.asyncResponse = as; 
} 

public interface AsyncResponse { 
    void onAsyncResponse(String result); // might be any argument length of any type 
} 

onPostExecute()で:

asyncResponse.onAsyncResponse(result); // result calculated from doInBackground() 
あなたのAsyncTaskクラスでは、このようなインターフェイスを宣言します

とアクティビティクラスで:それは便利だった場合

DownloadData dd = new DownloadData(new AsyncResponse() {...}); // implement onAsyncResponse here 
dd.execute(); 
関連する問題