使用 AsyncTask 显示输入流文件读取进度
Showing inputstream file read progress with AsyncTask
我想显示正在读取文件并将其放入数组列表的进度。这样做时,在应用程序以列表视图向用户显示数组列表之前,我想显示通过 AsyncTask 读取了多少文件。当前短暂显示白屏。正在读取的文件包含大约 20000 行。
AsyncTask(MyTask
)在onCreate()
方法中执行,如下:
private class MyAsync extends AsyncTask<Void, Integer, ArrayList<Movie>> {
ProgressDialog mProgressDialog;
ArrayList<Movie> movies;
@Override
protected void onPreExecute() {
super.onPreExecute();
//Show progress to user
mProgressDialog = new ProgressDialog(MovieRatingsActivity.this);
mProgressDialog.setTitle("Reading file");
mProgressDialog.setMessage("Reading file, Please Wait!");
mProgressDialog.setIndeterminate(false);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.show();
}
@Override
protected ArrayList<Movie> doInBackground(Void... voids) {
try {
InputStream inputStream = getResources().openRawResource(R.raw.ratings);
int count = inputStream.available();
// onProgressUpdate( (amount read by inputstream / size of file )* 100 );
movies = Movie.loadFromFile(inputStream);
return movies;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(Integer... progress) {
super.onProgressUpdate(progress);
mProgressDialog.setProgress(progress[0]);
}
@Override
protected void onPostExecute(ArrayList<Movie> movies) {
super.onPostExecute(movies);
mProgressDialog.dismiss();
mInflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
setListAdapter(new RowIconAdapter(getApplicationContext(), R.layout.listrow, R.id.row_label, movies));
}
}
函数Movie.loadFromFile(inputStream)
- 这是将数据放入数组列表的地方
/** Loads movie information from a raw resource file */
public static ArrayList<Movie> loadFromFile(InputStream inputStream) {
ArrayList<Movie> movies = new ArrayList<Movie>(20000);
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
String line;
try {
while ((line = br.readLine()) != null) {
String lRatings = line.substring(0,3).trim();
String lVotes = line.substring(4,12).trim();
String lName = line.substring(13).trim();
movies.add(new Movie(lName, lRatings, lVotes));
}
} catch (IOException iox) { } // pure evil at work
return movies;
}
在 doInBackground()
中调用 publishProgress(value)
,其中值是一个整数,表示已完成工作的百分比。
这将触发 onProgressUpdate()
并且您在 progress[0]
中获得先前传递的值,然后您可以相应地更新进度条。
编辑工作完成百分比的计算只能在loadFromFile()
的while
循环中进行。所以在这种情况下,删除 loadFromFile()
并将其所有代码放在 doInBackground()
中会更容易。然后像这样修改循环:
int counter = 0;
while ((line = br.readLine()) != null) {
String lRatings = line.substring(0,3).trim();
String lVotes = line.substring(4,12).trim();
String lName = line.substring(13).trim();
movies.add(new Movie(lName, lRatings, lVotes));
counter++;
if ((counter % 200) == 0)
publishProgress(counter / 200)
}
值 counter / 200
将是已完成工作的 1%,但如果它很耗时,您可以更改它
我想显示正在读取文件并将其放入数组列表的进度。这样做时,在应用程序以列表视图向用户显示数组列表之前,我想显示通过 AsyncTask 读取了多少文件。当前短暂显示白屏。正在读取的文件包含大约 20000 行。
AsyncTask(MyTask
)在onCreate()
方法中执行,如下:
private class MyAsync extends AsyncTask<Void, Integer, ArrayList<Movie>> {
ProgressDialog mProgressDialog;
ArrayList<Movie> movies;
@Override
protected void onPreExecute() {
super.onPreExecute();
//Show progress to user
mProgressDialog = new ProgressDialog(MovieRatingsActivity.this);
mProgressDialog.setTitle("Reading file");
mProgressDialog.setMessage("Reading file, Please Wait!");
mProgressDialog.setIndeterminate(false);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.show();
}
@Override
protected ArrayList<Movie> doInBackground(Void... voids) {
try {
InputStream inputStream = getResources().openRawResource(R.raw.ratings);
int count = inputStream.available();
// onProgressUpdate( (amount read by inputstream / size of file )* 100 );
movies = Movie.loadFromFile(inputStream);
return movies;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(Integer... progress) {
super.onProgressUpdate(progress);
mProgressDialog.setProgress(progress[0]);
}
@Override
protected void onPostExecute(ArrayList<Movie> movies) {
super.onPostExecute(movies);
mProgressDialog.dismiss();
mInflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
setListAdapter(new RowIconAdapter(getApplicationContext(), R.layout.listrow, R.id.row_label, movies));
}
}
函数Movie.loadFromFile(inputStream)
- 这是将数据放入数组列表的地方
/** Loads movie information from a raw resource file */
public static ArrayList<Movie> loadFromFile(InputStream inputStream) {
ArrayList<Movie> movies = new ArrayList<Movie>(20000);
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
String line;
try {
while ((line = br.readLine()) != null) {
String lRatings = line.substring(0,3).trim();
String lVotes = line.substring(4,12).trim();
String lName = line.substring(13).trim();
movies.add(new Movie(lName, lRatings, lVotes));
}
} catch (IOException iox) { } // pure evil at work
return movies;
}
在 doInBackground()
中调用 publishProgress(value)
,其中值是一个整数,表示已完成工作的百分比。
这将触发 onProgressUpdate()
并且您在 progress[0]
中获得先前传递的值,然后您可以相应地更新进度条。
编辑工作完成百分比的计算只能在loadFromFile()
的while
循环中进行。所以在这种情况下,删除 loadFromFile()
并将其所有代码放在 doInBackground()
中会更容易。然后像这样修改循环:
int counter = 0;
while ((line = br.readLine()) != null) {
String lRatings = line.substring(0,3).trim();
String lVotes = line.substring(4,12).trim();
String lName = line.substring(13).trim();
movies.add(new Movie(lName, lRatings, lVotes));
counter++;
if ((counter % 200) == 0)
publishProgress(counter / 200)
}
值 counter / 200
将是已完成工作的 1%,但如果它很耗时,您可以更改它