为了账号安全,请及时绑定邮箱和手机立即绑定

使用 AsyncTask 显示输入流文件读取进度

使用 AsyncTask 显示输入流文件读取进度

ibeautiful 2021-12-10 17:10:34
我想显示正在读取的文件的进度,并将其放入数组列表中。这样做时,在应用程序以列表视图向用户显示数组列表之前,我想显示通过 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));    }}
查看完整描述

1 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

内部doInBackground()调用publishProgress(value),其中 value 是一个整数,表示已完成工作的百分比。

这将触发onProgressUpdate()并且您获得先前传递的值progress[0],然后您可以相应地更新进度条。

编辑工作完成百分比的计算只能在while循环中进行loadFromFile()。因此,在这种情况下,更容易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%,但如果它很耗时,您可以更改它


查看完整回答
反对 回复 2021-12-10
  • 1 回答
  • 0 关注
  • 197 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号