Отображение прогресса чтения файла inputtream с AsyncTask - PullRequest
0 голосов
/ 28 октября 2018

Я хотел бы показать ход чтения файла и его размещения в списке массивов.При этом, прежде чем приложение представит пользователю массив-список в виде списка, я бы хотел показать, сколько файлов было прочитано с помощью 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;
}

1 Ответ

0 голосов
/ 28 октября 2018

Внутри doInBackground() вызов publishProgress(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% от выполненной работы, но вы можете изменить его, если это займет много времени

...