I am loading Auto complete text view with data written in my csv file but the file contains thousands of data, and hence it takes a lot of time to load, is there any way so that it can be done in background.
I have used Async task but can’t implement properly.
my code:
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();
}
}
my stack trace:
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)
i think this is because in doinbackground we can’t do any UI work.
So, how to handle this, is there any other way..
What is the problem, the long loading time or the crash log you’ve pasted in the question?
If it’s the crash, you can’t call
ArrayAdapter.addfrom a background thread, if thedoInBackgroundmethod is a part of anAsyncTask, you can addonPostExecuteto thatAsyncTaskwhich will run on the UI thread, and do theadds in that method.