2016-09-05 1 views
0

Ich möchte wissen, wie Sie auf die Daten zugreifen und sie an eine Komponente außerhalb des Klassenhauptteils von AsyncTask binden.Wie Daten aus der AsyncTask-Klasse in Android abrufen?

Ich habe eine Klasse wie:

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

und es hat eine Methode:

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

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

Ich verstehe doInBackground Rückgabedaten, wo nicht?

Weil, wenn ich meine Klasse verwenden möchten, ich benutze es wie:

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

kann ich es verwenden, wie das? weil ich aus meiner Hauptklasse zurückgegebenen Daten holen möge es einige Komponenten

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

schauen Sie auf Antworten und genehmigen, wenn es hilfreich war – Vyacheslav

Antwort

0

ich nicht

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

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

Ergebnis von Haupt-UI fangen zu binden.

Sie müssen Rückrufe verwenden. Zum Beispiel können Sie die Schnittstelle verwenden, um das Ergebnis zu erhalten.

Für eine Schnittstelle Beispiel erstellen:

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

erstellen Klasse:

 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 
} 
.... 
    } 
... 
    } 

irgendwo im Code:

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(...); 

Und, wie üblich, können Sie nach doInBackground via UI aktualisieren onPostExecute()

0

Wenn Sie nur ein Ergebnis von Ihrem AsyncTask Klasse zurückkehren möchten, so dass Sie die Benutzeroberfläche in Ihrer Tätigkeit entsprechend dem Ergebnis aktualisieren können Sie so etwas wie tun dies: in Ihrer AsyncTask Klasse eine Schnittstelle wie folgt erklären:

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 
} 

und in onPostExecute():

asyncResponse.onAsyncResponse(result); // result calculated from doInBackground() 

und in der Aktivitätsklasse:

DownloadData dd = new DownloadData(new AsyncResponse() {...}); // implement onAsyncResponse here 
dd.execute(); 
Verwandte Themen