0

改行で区切られた 173,139 語を含むテキスト ファイルがあります。基本的に、簡単にアクセスできるように、この 1.7 MB ファイルを文字列の配列にロードする必要があります。onCreate()アプリケーションの起動が非常に遅くなる可能性があるため、それ自体が問題を引き起こす可能性がありますが、今は辞書にロードしようとしているだけだと思います。

問題を調べたところ、この問題にはアセット マネージャーを使用する必要があることがわかったので、Dictionary クラスにあるものを次に示します。

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());

しかし、これらはすべて私のアプリケーションで致命的なエラーを引き起こすようです。

最後に 2 つの質問があります。このようにアプリケーション コードの先頭でインスタンス化しても問題ないでしょうか? もしそうなら、私がそうしようとしているときにそのコードが機能しないのはなぜですか?

編集: logcat の出力を求められました。申し訳ありませんが、これは私の最初の「本物の」Android プログラムです。これがまさにあなたが探しているものかどうかはわかりませんが、役立つかもしれないものも省略したくありません。

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

4

1 に答える 1

1

ちょっと考えてみてください: あなたのcontext.getAssets呼び出しは NPE をスローします (おそらく context が null のため)。

それは実際にメソッドDictionary dictionary = new Dictionary(this);を入れていないからだと思います。onCreate

そのコードをonCreate, の後にsuper.onCreate(bundle).

アプリの初期化の読み込み時間が心配な場合は、AsyncTaskを使用してスプラッシュ アクティビティで辞書を読み込むことをお勧めします。これにより、ユーザー フィードバックを提供できます。

于 2013-07-22T18:24:16.087 に答える