Занимает много времени при загрузке Auto Complete Textview - PullRequest
0 голосов
/ 01 марта 2012

Я загружаю Автозаполненный текстовый просмотр с данными, записанными в моем CSV-файле, но этот файл содержит тысячи данных, и, следовательно, загрузка занимает много времени, есть ли способ сделать это в фоновом режиме.Я использовал асинхронную задачу, но не могу ее правильно реализовать.

мой код:

ArrayAdapter<String> TitleAdapter;

    protected Void doInBackground(Void... params) {

    readTitle();

    return null;
}

public void readTitle()

{
    InputStream is = _context.getResources().openRawResource(
            R.raw.title);
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr, 8192);
    try {
        String test;
        while ((test = br.readLine()) != null) {
            String[] RowData = test.split(",");
            String Title = RowData[0];

            TitleAdapter.add(Title);
        }
        isr.close();
        is.close();
        br.close();

    } catch (IOException e) {
        e.printStackTrace();

    }

}

мой след стека:

 03-01 15:06:35.396: ERROR/AndroidRuntime(572): FATAL EXCEPTION: AsyncTask #1
    03-01 15:06:35.396: ERROR/AndroidRuntime(572): java.lang.RuntimeException: An error    occured while executing doInBackground()
  03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at    android.os.AsyncTask$3.done(AsyncTask.java:200)
  03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at java.lang.Thread.run(Thread.java:1096)
03-01 15:06:35.396: ERROR/AndroidRuntime(572): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at android.view.ViewRoot.checkThread(ViewRoot.java:2802)
03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at android.view.ViewRoot.requestLayout(ViewRoot.java:594)
03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at android.view.View.requestLayout(View.java:8125)
03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at android.view.View.requestLayout(View.java:8125)
03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at android.widget.AbsListView.requestLayout(AbsListView.java:993)
03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:790)
03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:31)
03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50)
03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at android.widget.ArrayAdapter.notifyDataSetChanged(ArrayAdapter.java:247)
03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at android.widget.ArrayAdapter.add(ArrayAdapter.java:179)
03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at com.Salary.Others.ReadFileHelper.readJobTitle(ReadFileHelper.java:111)
03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at com.Salary.Others.ReadFileHelper.doInBackground(ReadFileHelper.java:57)
03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at com.Salary.Others.ReadFileHelper.doInBackground(ReadFileHelper.java:1)
03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
03-01 15:06:35.396: ERROR/AndroidRuntime(572):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

Я думаю, это потому, что в doinbackgroundмы не можем работать с пользовательским интерфейсом.Итак, как с этим справиться, есть ли другой способ ..

1 Ответ

1 голос
/ 30 мая 2012

В чем проблема, длительное время загрузки или журнал сбоев, который вы вставили в вопрос?

Если это сбой, вы не можете вызвать ArrayAdapter.add из фонового потока, еслиМетод doInBackground является частью AsyncTask, вы можете добавить onPostExecute к этому AsyncTask, который будет выполняться в потоке пользовательского интерфейса, и выполнить add s в этом методе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...