2013-07-22 38 views
0

我有一個文本文件,其中有173,139個單詞由換行符分隔。基本上,我需要將這個1.7mb文件加載到一個字符串數組中,以便於訪問。我試圖在主要活動onCreate()中這樣做,這可能會導致它自己的問題,因爲它可能使啓動應用程序真的很慢,但現在我只是試圖加載字典中,我想。如何在外部類中的Android應用程序中使用Java加載此文本文件?

我擡頭的問題,我發現我應該使用資產管理公司對於這個問題,所以這是我在我的字典類:

public class Dictionary { 
    private String[] dictionary = new String[173139]; 
    private String[] acceptedWordsList = new String[173139]; 
    private String acceptedWords = ""; 

    public Dictionary(Context context){ 
     AssetManager am = context.getAssets(); 
     try { 
      String rawText; 
      int element = 0; 
      InputStream is = am.open("words.txt"); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
      while((rawText=reader.readLine()) != null){ 
       dictionary[element++] = rawText; 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

,我在實例化一個字典在我的主要活動幾乎是班上的第一行:

public class MainActivity extends Activity { 
    Dictionary dictionary = new Dictionary(this); 
    //rest of application code 
} 

我在做什麼錯在這裏?我也嘗試實例化一個解釋是這樣的:

Dictionary dictionary = new Dictionary(this.getApplicationContext());

還有:

Dictionary dictionary = new Dictionary(getApplicationContext());

,但所有的這些似乎在我的應用程序導致的致命錯誤。

所以最後有兩個問題:在應用程序代碼的開始時是否可以實例化呢?如果是這樣,爲什麼當我試圖這樣做時,這些代碼不工作?

編輯:我被要求提供logcat輸出。我的歉意,這是我第一個「真正的」android程序。我不知道這是不是你在尋找什麼,但我不想遺漏任何可能會有所幫助之一:

http://pastebin.com/raw.php?i=c99LFZzx

+0

'Logcat output'? – Vikram

+0

你的'onCreate()'代碼在哪裏? – Nima

+0

正好在字典的實例化之下。我被告知我應該把它放在onCreate()?現在就去嘗試一下。我唯一的擔心是我需要在主類的另一個方法中訪問字典,我不想實例化它兩次......嗯。 – Arnav

回答

1

只是一個想法:你context.getAssets調用拋出了NPE (可能因爲上下文爲空)。

我認爲這是因爲您實際上並沒有在onCreate方法中使用Dictionary dictionary = new Dictionary(this);

如果您將該代碼放在onCreate之後,super.onCreate(bundle)之後,我期望它能夠正常工作(假定該文件在那裏)。

如果您擔心應用程序初始化加載時間,我建議您使用AsyncTask加載您的字典在飛濺活動,所以你可以提供用戶反饋。

+0

我已經這樣做了,但我需要訪問onCreate()之外的字典,在另一個由按鈕調用的方法中。我想我仍然寧願在onCreate()中實例化字典,因爲它會在應用程序的開始時加載。任何方式我可以實例化onCreate()中的對象並在addToWords中訪問它? – Arnav

+1

@Arnav,正如我所說的那樣,如果你在飛濺的活動中加載它,你根本就不會有這個問題。您可以靜態使用表示字典的類,也可以將其從飛濺活動傳遞到主要活動。無論你的解決方案是什麼,如果你穿線它(即與一個AsyncTask),你將能夠初始化爲空,首先填充在一個單獨的線程,並檢查其他方法中的空值... – Mena

相關問題