मैं पढ़ने वाली फ़ाइल की प्रगति दिखाना चाहता हूं, और एक सरणी सूची में रखा गया है। ऐसा करने से पहले, एप्लिकेशन उपयोगकर्ता को सूची दृश्य में सरणी-सूची प्रस्तुत करता है, मैं यह दिखाना चाहता हूं कि 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
TJF 28 अक्टूबर 2018, 07:47

1 उत्तर

सबसे बढ़िया उत्तर

अंदर 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% होगा लेकिन यदि इसमें समय लगता है तो आप इसे बदल सकते हैं

1
forpas 28 अक्टूबर 2018, 07:06