java - आपक - ओपेरा मिनी डाउनलोड फ्री




Android के साथ एक फ़ाइल डाउनलोड करें, और प्रोग्रेसडिअलॉग में प्रगति दिखाएं (8)

मैं एक साधारण एप्लिकेशन लिखने की कोशिश कर रहा हूं जो अद्यतन हो जाता है। इसके लिए मुझे एक साधारण फ़ंक्शन की आवश्यकता है जो एक फ़ाइल डाउनलोड कर सकता है और ProgressDialog में वर्तमान प्रगति दिखा सकता है । मुझे पता है कि ProgressDialog कैसे करें, लेकिन मुझे यकीन नहीं है कि वर्तमान प्रगति को कैसे प्रदर्शित किया जाए और फ़ाइल को पहली बार कैसे डाउनलोड किया जाए।


एंड्रॉइड क्वेरी लाइब्रेरी का प्रयोग करें, वास्तव में बहुत अच्छा। आप ProgressDialog का उपयोग करने के लिए इसे अन्य उदाहरणों में देख सकते हैं, यह आपके लेआउट से प्रगति दृश्य दिखाएगा और पूरा होने के बाद इसे छुपाएगा।

File target = new File(new File(Environment.getExternalStorageDirectory(), "ApplicationName"), "tmp.pdf");
new AQuery(this).progress(R.id.progress_view).download(_competition.qualificationScoreCardsPdf(), target, new AjaxCallback<File>() {
    public void callback(String url, File file, AjaxStatus status) {
        if (file != null) {
            // do something with file  
        } 
    }
});

जबकि मैं एंड्रॉइड विकास सीखना शुरू कर रहा था, मैंने सीखा था कि ProgressDialog जाने का रास्ता है। ProgressDialog की सेट ProgressDialog विधि है जिसे फ़ाइल डाउनलोड होने के बाद प्रगति स्तर को अपडेट करने के लिए बुलाया जा सकता है।

मैंने कई ऐप्स में सबसे अच्छा देखा है कि वे स्टॉक संस्करण की तुलना में प्रगति संवाद को बेहतर रूप से देखने और महसूस करने के लिए इस प्रगति संवाद के गुणों को अनुकूलित करते हैं। उपयोगकर्ता को मेंढक, हाथी या प्यारा बिल्लियों / पिल्ले जैसे कुछ एनीमेशन से जुड़े रखने के लिए अच्छा लगा। प्रगति संवाद में कोई भी एनीमेशन उपयोगकर्ताओं को आकर्षित करता है और वे लंबे समय तक प्रतीक्षा करने की तरह महसूस नहीं करते हैं।

मैं ProgressDialog पर एक ब्लॉग पोस्ट लिखूंगा और जल्द ही यहां साझा करूंगा।

संपादित करें: एंड्रॉइड में फ़ाइल डाउनलोड करते समय प्रोग्रेस बार दिखाएं


मुझे this ब्लॉग पोस्ट बहुत उपयोगी पाया गया है, यह फ़ाइल डाउनलोड करने के लिए लूपजे का उपयोग कर रहा है, इसमें केवल एक सरल कार्य है, कुछ नए एंड्रॉइड लोगों के लिए सहायक होगा।


मेरी व्यक्तिगत सलाह प्रगति संवाद का उपयोग करना और निष्पादन से पहले बनाना, या OnPreExecute() पर शुरू करना है, यदि आप प्रगति संवाद की प्रगति पट्टी की क्षैतिज शैली का उपयोग करते हैं तो अक्सर प्रगति प्रकाशित करें। शेष भाग doInBackground के एल्गोरिदम अनुकूलित करने के लिए है।


मैं आपको अपने प्रोजेक्ट Netroid का उपयोग करने की सलाह Netroid , यह Volley पर आधारित है। मैंने इसमें कुछ विशेषताओं को जोड़ा है जैसे मल्टी-इवेंट कॉलबैक, फ़ाइल डाउनलोड प्रबंधन। यह कुछ मदद की हो सकती है।


मैंने उसी संदर्भ में progressDialog निर्माण को संभालने के लिए AsyncTask क्लास को संशोधित किया है। मुझे लगता है कि निम्न कोड अधिक पुन: प्रयोज्य होगा। (इसे किसी भी गतिविधि से संदर्भित किया जा सकता है बस संदर्भ पास करें, लक्ष्य फ़ाइल, संवाद संदेश)

public static class DownloadTask extends AsyncTask<String, Integer, String> {
    private ProgressDialog mPDialog;
    private Context mContext;
    private PowerManager.WakeLock mWakeLock;
    private File mTargetFile;
    //Constructor parameters :
    // @context (current Activity)
    // @targetFile (File object to write,it will be overwritten if exist)
    // @dialogMessage (message of the ProgresDialog)
    public DownloadTask(Context context,File targetFile,String dialogMessage) {
        this.mContext = context;
        this.mTargetFile = targetFile;
        mPDialog = new ProgressDialog(context);

        mPDialog.setMessage(dialogMessage);
        mPDialog.setIndeterminate(true);
        mPDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mPDialog.setCancelable(true);
        // reference to instance to use inside listener
        final DownloadTask me = this;
        mPDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                me.cancel(true);
            }
        });
        Log.i("DownloadTask","Constructor done");
    }

    @Override
    protected String doInBackground(String... sUrl) {
        InputStream input = null;
        OutputStream output = null;
        HttpURLConnection connection = null;
        try {
            URL url = new URL(sUrl[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            // expect HTTP 200 OK, so we don't mistakenly save error report
            // instead of the file
            if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
                return "Server returned HTTP " + connection.getResponseCode()
                        + " " + connection.getResponseMessage();
            }
            Log.i("DownloadTask","Response " + connection.getResponseCode());

            // this will be useful to display download percentage
            // might be -1: server did not report the length
            int fileLength = connection.getContentLength();

            // download the file
            input = connection.getInputStream();
            output = new FileOutputStream(mTargetFile,false);

            byte data[] = new byte[4096];
            long total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                // allow canceling with back button
                if (isCancelled()) {
                    Log.i("DownloadTask","Cancelled");
                    input.close();
                    return null;
                }
                total += count;
                // publishing the progress....
                if (fileLength > 0) // only if total length is known
                    publishProgress((int) (total * 100 / fileLength));
                output.write(data, 0, count);
            }
        } catch (Exception e) {
            return e.toString();
        } finally {
            try {
                if (output != null)
                    output.close();
                if (input != null)
                    input.close();
            } catch (IOException ignored) {
            }

            if (connection != null)
                connection.disconnect();
        }
        return null;
    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // take CPU lock to prevent CPU from going off if the user
        // presses the power button during download
        PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                getClass().getName());
        mWakeLock.acquire();

        mPDialog.show();

    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        super.onProgressUpdate(progress);
        // if we get here, length is known, now set indeterminate to false
        mPDialog.setIndeterminate(false);
        mPDialog.setMax(100);
        mPDialog.setProgress(progress[0]);

    }

    @Override
    protected void onPostExecute(String result) {
        Log.i("DownloadTask", "Work Done! PostExecute");
        mWakeLock.release();
        mPDialog.dismiss();
        if (result != null)
            Toast.makeText(mContext,"Download error: "+result, Toast.LENGTH_LONG).show();
        else
            Toast.makeText(mContext,"File Downloaded", Toast.LENGTH_SHORT).show();
    }
}

हां उपर्युक्त कोड काम करेगा onProgressUpdate यदि आप अपनी progressbar onProgressUpdate को Asynctask progressbar में अपडेट कर रहे हैं और आप बैक बटन दबाएं या अपनी गतिविधि खत्म करें AsyncTask आपके यूआई के साथ अपना ट्रैक खो देता है .और जब आप अपनी गतिविधि पर वापस जाते हैं, भले ही डाउनलोड चल रहा हो पृष्ठभूमि आपको प्रगति पट्टी पर कोई अपडेट नहीं दिखाई देगा। तो OnResume() पर एक थ्रेड चलाने की कोशिश करें जैसे runOnUIThread एक टाइमर कार्य के साथ जो आपके progressbar AsyncTask को AsyncTask चलती पृष्ठभूमि से अद्यतन मानों के साथ अद्यतन करता है।

private void updateProgressBar(){
    Runnable runnable = new updateProgress();
    background = new Thread(runnable);
    background.start();
}

public class updateProgress implements Runnable {
    public void run() {
        while(Thread.currentThread()==background)
            //while (!Thread.currentThread().isInterrupted()) {
            try {
                Thread.sleep(1000); 
                Message msg = new Message();
                progress = getProgressPercentage();        
                handler.sendMessage(msg);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            } catch (Exception e) {
        }
    }
}

private Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        progress.setProgress(msg.what);
    }
};

जब आपकी गतिविधि दिखाई नहीं दे रही है तो धागे को नष्ट करना न भूलें।

private void destroyRunningThreads() {
    if (background != null) {
        background.interrupt();
        background=null;
    }
}

नई फ़ाइल ("/ mnt / sdcard / ...") द्वारा "/ sdcard ..." को प्रतिस्थापित करना न भूलें अन्यथा आपको FileNotFoundException मिलेगा






android-asynctask