2016-10-17 36 views
-1

Ich kodiere eine Android App. Zu einem bestimmten Zeitpunkt wird die App aufgefordert, Daten von einem Web-Service, den ich auf Heroku habe, abzurufen. Die Klasse, die die Methoden enthält, die Daten abrufen, und die Klasse mit den Methoden, die diese Daten verwenden, sind unterschiedlich. Ich versuche, die Daten von einem AsyncTask onPostExecute() an meine andere Klasse über eine Schnittstelle zu übergeben; Allerdings bekomme ich eine nervende NullPointerException und ich verstehe den Grund dafür nicht!Android JAVA - NullPointerException bei der Verwendung und Schnittstelle Feld

Meine "main" Klasse:

public class Details extends AppCompatActivity implements ResponseFromWebService.AsyncResponse { 
@Override 
    public void processFinish(String output){ 
     System.out.println(output); 
    } 
//Other Stuff 
} 

Meine ResponseFromWebService Klasse:

public class ResponseFromWebService { 

public void getData (String Name) { 
    new JSONTask().execute("censored-URL"); 
} 

public interface AsyncResponse { 
    void processFinish(String output); 
} 

public class JSONTask extends AsyncTask<String, String, String> { 

    AsyncResponse delegate = null; 

    @Override 
    protected String doInBackground(String... params) { 
     HttpURLConnection connection = null; 
     BufferedReader reader = null; 
     StringBuffer buffer = new StringBuffer(); 

     try { 
      URL url = new URL(params[0]); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.connect(); 

      InputStream stream = connection.getInputStream(); 

      reader = new BufferedReader(new InputStreamReader(stream)); 

      String line = ""; 
      while ((line = reader.readLine()) != null) { 
       buffer.append(line); 
      } 

      String finalJson = buffer.toString(); 

      JSONObject finalObject = new JSONObject(finalJson); 

      String Desc = finalObject.getString("desc"); 

      return Desc; 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } finally { 
      if (connection != null) 
       connection.disconnect(); 
      try { 
       if (reader != null) 
        reader.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
     delegate.processFinish(s); 
    } 
} 
} 

Die NPE tritt in der letzten Zeile, wenn ein Anruf zu delegate.processFinish(s); ist

wirklich Hilfe benötigen !

+0

Verwendung Debugger ... –

Antwort

4

delegate wird nie festgelegt.

Set es mit einem Konstruktor zum Beispiel

public class JSONTask extends AsyncTask<String, String, String> { 

    public JSONTask(AsyncResponse delegate) { 
     this.delegate = delegate 
    } 

    AsyncResponse delegate = null; 

    @Override 
    protected String doInBackground(String... params) { 
     // [...] 

Und dann in ResponseFromWebService

public void getData (String Name, AsyncResponse ar) { 
    new JSONTask(ar).execute("censored-URL"); 
} 
+0

VIELEN DANK !!! Das hat mein Problem gelöst! –

0

Sollten Sie der Delegiertenvariablen keine Referenz zuweisen? Sie weisen dieser Variablen am Anfang null zu, und nichts anderes wird zugewiesen, bis sie in der finalen Anweisung aufgerufen wird. Sie ist immer noch null, daher erhalten Sie eine NullPointerException.

AsyncResponse delegate = null; 
Verwandte Themen