使用 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));

    }

}

ibeautiful
浏览 198回答 1
1回答

四季花海

内部doInBackground()调用publishProgress(value),其中 value 是一个整数,表示已完成工作的百分比。这将触发onProgressUpdate()并且您获得先前传递的值progress[0],然后您可以相应地更新进度条。编辑工作完成百分比的计算只能在while循环中进行loadFromFile()。因此,在这种情况下,更容易loadFromFile()将其所有代码删除并放入doInBackground(). 然后像这样修改循环:int counter = 0;while ((line = br.readLine()) != null) {&nbsp; &nbsp; String lRatings = line.substring(0,3).trim();&nbsp; &nbsp; String lVotes = line.substring(4,12).trim();&nbsp; &nbsp; String lName = line.substring(13).trim();&nbsp; &nbsp; movies.add(new Movie(lName, lRatings, lVotes));&nbsp; &nbsp; counter++;&nbsp; &nbsp; if ((counter % 200) == 0)&nbsp; &nbsp; &nbsp; &nbsp; publishProgress(counter / 200)}&nbsp;该值counter / 200将是已完成工作的 1%,但如果它很耗时,您可以更改它
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java