2016-05-28 5 views
1

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

+3

Meinten Sie schreiben 'protected void oonPostExecute (String Ergebnis)' mit Doppel "oo" wurde writting? – Rucsi

+0

Lol .... Danke xDDD – Onelio

+0

:) 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

Antwort

2

Dank Rucsi, ich fand er, dass ich OnPostExecute mit Doppel-O