2016-03-29 10 views
1

Ich habe Probleme mit dem Lesen von einfachen TXT aus Assets-Verzeichnis. Ich kann nicht wirklich herausfinden, warum es nicht funktioniert und was falsch ist. HierProbleme mit dem Lesen von Textdatei von Assets (Xamarin)

ist der Code der Methode, die ich schrieb:

 private string ReadFile(){ 
     var stream = Assets.Open ("sampleText.txt"); 
     StreamReader sr = new StreamReader (stream); 
     string text = sr.ReadToEnd(); 
     sr.Close(); 
     return text; 
    } 

Und hier ist der Fehler:

Java.Lang.NullPointerException: Exception of type 'Java.Lang.NullPointerException' was thrown. 
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in /Users/builder/data/lanes/2970/46c3f7e0/source/mono/external/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 
at Android.Runtime.JNIEnv.CallNonvirtualObjectMethod (IntPtr jobject, IntPtr jclass, IntPtr jmethod) [0x00084] in /Users/builder/data/lanes/2970/46c3f7e0/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:596 
at Android.Content.ContextWrapper.get_Assets() [0x0005f] in /Users/builder/data/lanes/2970/46c3f7e0/source/monodroid/src/Mono.Android/platforms/android-19/src/generated/Android.Content.ContextWrapper.cs:154 

ich meine ganze Anwendung keine Probleme hatte, auf Fenster mit Laufen, nur ich habe Probleme Lass es auf Android laufen. Versuchte verschiedene Dinge, wie zum Beispiel AssetManager, aber nicht so gut.

Die Textdatei ist als AndroidAsset markiert.

Das ist mein TextChangeBench:

public class TextChangeBench : Activity 
{ 
    public TextChangeBench(){} 

    private void SaveFile(string[] tab){ 

     string saveLocation = "sampleTextReworked.txt"; 
     StreamWriter sw = new StreamWriter (saveLocation); 
     foreach (string s in tab) { 
      sw.Write (s); 
     } 
     sw.Close(); 
    } 

    private string ReadFile(){ 
     var stream = Assets.Open ("sampleText.txt"); 
     StreamReader sr = new StreamReader (stream); 
     string text = sr.ReadToEnd(); 
     sr.Close(); 
     return text; 
    } 
    public void ChangeText(){ 
     try{ 
      File.Delete("sampleTextReworked.txt"); 
     }catch(FileNotFoundException e){Console.WriteLine (e);} 

     try{ 
      string text = ReadFile(); 
      char c; 
      string[] newTab = new string[text.Length]; 
      for (int i = 0; i < text.Length; i++) 
      { 
       c = (char)text [i]; 
       if (Char.IsUpper(c)) 
       { 
        newTab[i] = text[i].ToString().ToLower(); 
       } 
       else if (Char.IsLower(c)) 
       { 
        newTab[i] = text[i].ToString().ToUpper(); 
       } 
       else 
       { 
        newTab[i] = text[i].ToString(); 
       } 
      } 
      SaveFile(newTab); 
     } 
     catch(Exception e){Console.WriteLine ("{0} ", e);} 
    } 
} 

Das ist meine MainActivity:

[Activity (Label = "csBench", MainLauncher = true, Icon = "@mipmap/icon")] 
public class MainActivity : Activity 
{ 
    protected override void OnCreate (Bundle savedInstanceState) 
    { 
     base.OnCreate (savedInstanceState); 

     SetContentView (Resource.Layout.Main); 
     Button startButton = FindViewById<Button> (Resource.Id.start); 
     startButton.Click += delegate { 

      MathBench mb = new MathBench(); 
      TextChangeBench tcb = new TextChangeBench(); 
      PassedTime pt = new PassedTime(); 
      EditText et = (EditText)FindViewById (Resource.Id.textInfo); 

      for (int i = 0; i < 5; i++) { 
       pt.StartMeasuring(); 
       //mb.Silnia (25); 
       //mb.Fibonacci (32); 
       //mb.BubbleSort(); 
       tcb.ChangeText(); 
       if (i == 4) { 
        pt.StopMeasuring(); 

        et.SetText(pt.ReturnResult(), TextView.BufferType.Normal); 
        //et.SetText(pt.ReturnResult().ToString()); 
        //Console.WriteLine(pt.ReturnResult()); 
        pt.ResetTimers(); 
       } 
      } 
     }; 

    } 
} 

Jede Hilfe ist willkommen, danke im voraus.

+0

Ist die Build-Aktion von 'sampleText.txt' auf' AndroidAsset'? –

+0

Ja, es ist wie ich schon sagte. – definitelyNotLazy

+0

Welche spezifische Zeile wirft den Fehler? – Jason

Antwort

5

Dieser Fehler tritt auf, weil das manuelle Erstellen einer Instanz einer Aktivität wie TextChangeBench den Einrichtungsvorgang für Android-Frameworks umgeht und die Aktivität in einem ungültigen Zustand belässt.

Aktivitäten werden als ein Punkt der Benutzerinteraktion verwendet und binden eine Ansicht/einen Bildschirm an die Logik in Ihrer Anwendung. Da TextChangeBench nur Anwendungslogik implementiert, muss es nicht von Activity abgeleitet werden und wäre besser als reine C# -Klasse geeignet.

Entfernen Sie die Vererbung in Aktivität, um den Code für TextChangeBench zu vereinfachen. Dies bedeutet, dass wir keinen Zugriff mehr auf die Assets-Eigenschaft haben und daher keine Assets abrufen können. Wir können dieses Problem beheben, indem stattdessen den globalen Anwendungskontext mit:

var stream = Android.App.Application.Context.Assets.Open("sampleText.txt"); 

Die Kombination der Aktivität Vererbung zu entfernen und mit dem globalen Kontext den Asset-Manager für den Zugriff auf die Java.Lang.NullPointerException beheben.

Der endgültige Code würde wie folgt aussehen:

public class TextChangeBench 
{ 
    private void SaveFile(string[] tab) 
    { 

     string saveLocation = "sampleTextReworked.txt"; 
     StreamWriter sw = new StreamWriter(saveLocation); 
     foreach (string s in tab) 
     { 
      sw.Write(s); 
     } 
     sw.Close(); 
    } 

    private string ReadFile() 
    { 
     var stream = Android.App.Application.Context.Assets.Open("sampleText.txt"); 

     StreamReader sr = new StreamReader(stream); 
     string text = sr.ReadToEnd(); 
     sr.Close(); 
     return text; 
    } 
    public void ChangeText() 
    { 
     try 
     { 
      File.Delete("sampleTextReworked.txt"); 
     } 
     catch (FileNotFoundException e) { Console.WriteLine(e); } 

     try 
     { 
      string text = ReadFile(); 
      char c; 
      string[] newTab = new string[text.Length]; 
      for (int i = 0; i < text.Length; i++) 
      { 
       c = (char)text[i]; 
       if (Char.IsUpper(c)) 
       { 
        newTab[i] = text[i].ToString().ToLower(); 
       } 
       else if (Char.IsLower(c)) 
       { 
        newTab[i] = text[i].ToString().ToUpper(); 
       } 
       else 
       { 
        newTab[i] = text[i].ToString(); 
       } 
      } 
      SaveFile(newTab); 
     } 
     catch (Exception e) { Console.WriteLine("{0} ", e); } 
    } 
} 

See:

+0

Funktioniert perfekt, vielen Dank! – definitelyNotLazy