2017-02-16 6 views
0

Ich versuche, dieses Funktionsformular innerhalb einer Serviceklasse aufzurufen, die ich erstellt habe. Ich habe einige Probleme mit dem Kontext, der erforderlich ist, damit diese Funktion funktioniert. Es ist meines Wissens, dass, wenn wir mit Kontext innerhalb eines Dienstes arbeiten, der die Methode getBaseContext() tun sollte, aber aus irgendeinem Grund gibt mir diese Methode eine Nullzeigerausnahme. Dies ist der Code, den ich für die File-Reader-Methode verwende. Ich werde die Ausnahme auch einschließen.Übergeben von Kontext in einem Service

Einige der Dinge, die ich ausprobiert habe, sind mit Blick auf die Änderung getBaseContext() zu getApplicationContext(), aber ich bekomme keine Ergebnisse. Wie manipulieren wir den Kontext innerhalb eines Dienstes?

Datei Lesercode:

public String fileReader(Context context, String fileName) throws IOException, JSONException { 
     FileInputStream fis = getBaseContext().openFileInput(fileName); 
     InputStreamReader isr = new InputStreamReader(fis); 
     BufferedReader streamReader = new BufferedReader(isr); 

     StringBuilder responseStrBuilder = new StringBuilder(); 

     String inputString; 
     while((inputString = streamReader.readLine()) != null) { 
      responseStrBuilder.append(inputString); 
     } 
     streamReader.close(); 
     isr.close(); 
     fis.close(); 


     return responseStrBuilder.toString(); 


    } 

Die Ausnahme:

W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.FileInputStream android.content.Context.openFileInput(java.lang.String)' on a null object reference 
W/System.err:  at com.example.allwaystrack01.internalhtml_chat_demo.services.SystemWebService.fileReader(SystemWebService.java:115) 
W/System.err:  at com.example.allwaystrack01.internalhtml_chat_demo.services.SystemWebService$WebAppInterface.returnContent(SystemWebService.java:176) 
W/System.err:  at org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method) 
W/System.err:  at org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:39) 
W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:102) 
W/System.err:  at android.os.Looper.loop(Looper.java:154) 
W/System.err:  at android.os.HandlerThread.run(HandlerThread.java:61) 

Als Randbemerkung, funktioniert diese Methode, wenn sie von einer tatsächlichen Aktivität aufgerufen wird. Aber nicht aus dem Service. Irgendeine bestimmte Begründung dahinter?

Ich würde gerne Zeiger.

+1

versuchen Sie dies 'context.openFileInput (fileName);' –

+0

in der Filereader-Methode, die Sie in einem Kontextobjekt übergeben, warum verwenden Sie das nicht, warum verwenden Sie getBaseContext()? – Tacolibre

+1

Ich referenzierte Kontext vor, aber es funktionierte nicht, eine Lösung, die andere in einem anderen Beitrag vorgeschlagen, war die Verwendung von getBaseContext(), also habe ich versucht, das auch zu verwenden. Es funktioniert nicht in beide Richtungen. –

Antwort

4

Ein Service ist ein Kontext, so sollten Sie in der Lage zu tun:

openFileInput(fileName); 

Ohne die getBaseContext oder getApplicationContext.

Wenn die Klasse Service erweitert. Das würde zumindest keine NPE auf den Kontext werfen.

Aber es kann sein, dass Sie die Datei von der falschen Methode lesen, zum Beispiel onBind und nicht im Konstruktor?

Stellen Sie außerdem sicher, dass Sie die Berechtigung für die Datei haben, die Sie lesen möchten, da Sie unter Android 6.0 die Berechtigung zum Zugriff auf externe Dateien benötigen.

Stellen Sie außerdem sicher, dass der Zeichenfolgendateiname beim Aufrufen der Methode nicht null ist.

+1

Danke Joakim, du hast Recht! In diesem Fall habe ich vergessen, den Kontext der Aktivität, die das aufgerufen hat, zu übergeben. Es war so einfach wie übergeben .getBaseContext() und der Code funktioniert jetzt. Weil dieser Dienst von der Hauptaktivität aus aufgerufen wird. Prost! –

Verwandte Themen