Ich verwende eine AsyncTask in Android, um eine Anfrage an einen Server zu machen und dann die Daten zu einer anderen Klasse zu erhalten. Ich weiß, dass AsyncTask nichts zurückgibt, also verwendete ich Code, der von anderen Leuten erstellt wurde, um Strings über eine Schnittstelle zurückzugeben.AsyncTask in Android mit Rückkehrschnittstelle
Hier haben Sie die AsyncTask Klassencode:
public class WebRequest extends AsyncTask<String, Void, String> {
//Data
public String mFileContents = "false";
//API-Info
public WebRequestResponse delegate = null;
public WebRequest(WebRequestResponse asyncResponse) {
delegate = asyncResponse;//Assigning call back interfacethrough constructor
}
@Override
protected String doInBackground(String... params) {
mFileContents = downloadFile(params[0]);
if(mFileContents == null) {
Log.d("DownloadData", "Error Downloading");
}
return mFileContents;
}
protected void oonPostExecute(String result) {
super.onPostExecute(result);
delegate.processFinish(mFileContents);
Log.d("DownloadData", "Result was: " + result); //result
}
private String downloadFile(String urlPath) {
StringBuilder tempBuffer = new StringBuilder();
try {
URL url = new URL(urlPath);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
int response = connection.getResponseCode();
Log.d("DownloadData", "The response code was " + response);
InputStream is = connection.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
int charRead;
char[] inputBuffer = new char[500];
while(true){
charRead = isr.read(inputBuffer);
if(charRead <=0) {
break;
}
tempBuffer.append(String.copyValueOf(inputBuffer, 0, charRead));
}
return tempBuffer.toString();
} catch(IOException e) {
Log.d("DownloadData", "IO Exception reading data: " + e.getMessage());
e.printStackTrace();
} catch(SecurityException e) {
Log.d("DownloadData", "Security exception. Needs permissions? " + e.getMessage());
}
return null;
}
}
nun die Schnittstelle:
public interface WebRequestResponse {
void processFinish(String output);
}
In der Sync-Klasse I dieses:
public class API implements WebRequestResponse {
Und ich mache das Ausführen wie:
public static void StartRequest(String url) {
String response = null;
WebRequest Request = new WebRequest(new WebRequestResponse() {
@Override
public void processFinish(String output) {
Test(output); //Testing the response code
}
});
Request.execute(url);
}
Das Problem ist, dass der Code nie aufgerufen wird und nie etwas zurückgibt. Mit Log.d habe ich festgestellt, dass nichts von hier funktioniert: "delegate.processFinish (mFileContents);" das ist in der AsyncTask-Klasse zugeordnet. Was mache ich falsch?
Dank
Meinten Sie schreiben 'protected void oonPostExecute (String Ergebnis)' mit Doppel "oo" wurde writting? – Rucsi
Lol .... Danke xDDD – Onelio
:) Ich bin froh, dass ich helfen konnte! Beachten Sie, dass es eine gute Übung ist, Annotation @override hinzuzufügen, damit diese Art von Fehlern nie passiert ... – Rucsi