0

テキストファイルからデータを読み込み、各ファイルのデータを個別に保存するアプリがありますArrayList。onCreateメソッドからのすべてのデータの読み込みがクラッシュしない場合でも、非同期スレッドにデータを読み込むように言われました(テキストファイルからArrayListsにすべてのデータを読み込むのに約12秒かかります)。

非同期スレッドを設定しようとしましたが、問題が発生しました。私は非同期スレッドを初めて使用するため、すべての詳細を理解していません/まだ完全には理解していません(さまざまなソースから情報をつなぎ合わせようとしています)。関連するコードは次のとおりです。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_name);

    new loadData().execute();

    arrayListElement = ArrayList1.get(0);

}

private class loadData extends AsyncTask<Void, Void, Void> {

    ProgressDialog dialog;
    protected void onPreExecute() {
        dialog = new ProgressDialog(ClassName.this);
        dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        dialog.show();
    }

    @Override
    protected Void doInBackground(Void... arg0) {
    // TODO Auto-generated method stub
        populateArrayLists();
        return null;
    }

    /*protected void onProgressUpdate() {

    }

    protected void onPostExecute() {

    }*/

}

onCreateメソッドの最後のステートメントでIndexOutOfBoundsException(無効なインデックス0、サイズは0)を取得しています。

私がやりたいのは、別のスレッドにデータをロードすることだけです。アプリがクラッシュしなくても、実行するように言われたからです。UIスレッドは残りのすべてを処理する必要があります。非同期スレッドコードを追加するまで、アプリは正常に機能していました。

私のファイルがどのように読み取られるかはここで見ることができます: Android:非同期スレッドが必要ですか?

私は何が間違っているのですか?

4

2 に答える 2

2

AsyncTaskの実行はまだ完了していません。そのためarrayListElement = ArrayList1.get(0);、がIndexOutOfBoundsException

これを試して

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_name);

    new loadData().execute();
}

private class loadData extends AsyncTask<Void, Void, Void> {

    ProgressDialog dialog;
    protected void onPreExecute() {
        dialog = new ProgressDialog(ClassName.this);
        dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        dialog.show();
    }

    @Override
    protected Void doInBackground(Void... arg0) {
    // TODO Auto-generated method stub
        populateArrayLists();
        return null;
    }

    protected void onPostExecute(Void result) {
        arrayListElement = ArrayList1.get(0);
        dialog.dismiss();
        super.onPostExecute(result);
    }

}
于 2013-02-06T02:21:45.733 に答える
1

doInBackgroundからnullを返しているので、もちろんこれはすべて失敗します。AsyncTaskを使用して、その目的を実行します。正しく機能させるには、適切な型パラメーターを使用してAsyncTaskを正しく定義する必要があります。

PopulateArrayListsに他のフィールドを更新するという副作用を持たせる代わりに、次のようなメソッドを使用します。

void List<Foo> getListOfFoo() {
  ArrayList<Foo> listOfFoos = getTheListSomehow();
  return listOfFoos;
}

例えば:

    public class MyActivity extends Activity {


        public void doSomething(List<String> stringList) {
           //do something here

        }

        class MyAsyncTask extends AsyncTask<Void, Void, List<String>> {

            @Override
            protected List<String> doInBackground(Void... params) {
                ArrayList<String> listOfStrings = getListOfStrings();
                return listOfStrings;
            }

            @Override
            protected void onPostExecute(List<String> strings) {
                super.onPostExecute(strings);
                doSomething(strings);
            }

            private List<String> getListOfStrings() {
ArrayList<String> stringList = new ArrayList<String>();
                //This is where you'd actually perform your expensive operation
  BufferedReader br = null;
    try {
        br = new BufferedReader(new InputStreamReader(getAssets().open(
                "text1.txt")));
        String text;
        while ((word = br.readLine()) != null) {
            stringList.add(text);
        }                           
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            br.close(); // stop reading
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
                return stringList;
            }
        }
    }
于 2013-02-06T02:29:26.350 に答える