How to use Asynchronous task for download progress dialog in fragment?

北城余情 提交于 2019-12-08 10:42:21

问题


In my application,when i click on file it will start downloading from server and progress will be shown in phone status bar.But i want progress bar to be shown on my application screen itself.

I followed this link :-

http://www.androidhive.info/2012/04/android-downloading-file-by-showing-progress-bar/

While approaching problem statement i come across these SYSTEM_DOWNLOADER and APP_DOWNLOADER .

  1. What these exactly do ?

  2. Above example is called in activity.I wanted to know how to call Asynch task with download progress bar in fragment.

I am editing question for clarification,Please help

        convertView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                MoodleModule module = listObjects.get(position).module;
                if (module == null)
                    return;
                Intent i = new Intent(context, AppBrowserActivity.class);

                String modurl = module.getUrl();
                String courseurl = session.getmUrl()
                        + "/course/view.php?id=" + courseid;
                modurl = (modurl == null) ? courseurl : modurl;
                i.putExtra("url", modurl);

                if (!module.getModname().contentEquals("resource")) {
                    context.startActivity(i);
                    return;
                }

                if (module.getContents() == null) {
                    context.startActivity(i);
                    return;
                }

                if (module.getContents().isEmpty()) {
                    context.startActivity(i);
                    return;
                }

                MoodleModuleContent content = module.getContents().get(0);
                String path = "/s" + session.getCurrentSiteId() + "c"
                        + courseid + "/";
                File file = new File(Environment
                        .getExternalStoragePublicDirectory("/MDroid")
                        + path + content.getFilename());
                 //TODO here
                // Download if file doesn't already exist
                if (!file.exists()) {
                    String fileurl = content.getFileurl();
                    fileurl += "&token=" + session.getToken();
                    fName=content.getFilename();

                //FROM HERE I AM CALLING ASYNCHRONOUS TASK
                    startDownload();


                } else {
                    FileOpener.open(context, file);
                }

            }
        });

        return convertView;
    }

    private void startDownload() {
        String url = "http://farm1.static.flickr.com/114/298125983_0e4bf66782_b.jpg";
        new DownloadFileAsync().execute(url);
    }

    protected Dialog onCreateDialog(int id) {
        switch (id) {
            case DIALOG_DOWNLOAD_PROGRESS:
                mProgressDialog = new ProgressDialog(getActivity());
                mProgressDialog.setMessage("Downloading file..");
                mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                mProgressDialog.setCancelable(false);

                return mProgressDialog;
            default:
                return null;
        }
    }
    class DownloadFileAsync extends AsyncTask<String, String, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            /*mProgressDialog = new ProgressDialog(getActivity());
            mProgressDialog.setMessage("Downloading file.");
            mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            mProgressDialog.setCancelable(false);
            mProgressDialog.show();*/
            /*showDialog(DIALOG_DOWNLOAD_PROGRESS);*/

            mProgressDialog.show();
        }

        @Override
        protected String doInBackground(String... aurl) {
            int count;
            /*String fName=content.getFilename();*/
            /*InputStream input = null;
            OutputStream output = null;*/
            HttpURLConnection connection = null;
            try {

                URL url = new URL(aurl[0]);
                URLConnection conexion = url.openConnection();
                conexion.connect();

                int lenghtOfFile = conexion.getContentLength();
                Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile);

           /* File f = new File(Environment.getExternalStorageDirectory()
                    + "/sdcard/");
            f.mkdirs();*/

                InputStream input = new BufferedInputStream(url.openStream());
                OutputStream output = new FileOutputStream("/sdcard/some_photo_from_gdansk_poland.jpg");

                byte data[] = new byte[1024];

                long total = 0;

                while ((count = input.read(data)) != -1) {
                    total += count;
                    publishProgress(""+(int)((total*100)/lenghtOfFile));
                    output.write(data, 0, count);
                }

                output.flush();
                output.close();
                input.close();
            } catch (Exception e) {}
            return null;

        }
        protected void onProgressUpdate(String... progress) {

            mProgressDialog.setProgress(Integer.parseInt(progress[0]));
       /* mProgressDialog.dismiss();*/
        }

        @Override
        protected void onPostExecute(String unused) {
        /*dismissDialog(DIALOG_DOWNLOAD_PROGRESS);*/
            mProgressDialog.dismiss();
        }
    }

When i click on file,app gives force stop.what mistake i am doing??Please help me out.thanks


回答1:


I found answer on my own.Hope it will help anybody.

I wanted to call asynch task in fragment and wanted to show progress diolog which will show progress of downloading file in percentage.

1> I called asynch task in class .

DownloadTask.java class

//This is important
public DownloadTask(Context context) {
    this.context = context;
    mProgressDialog = new ProgressDialog(context);

    mProgressDialog.setMessage("Downloading file..");
    mProgressDialog.setIndeterminate(false);
    mProgressDialog.setMax(100);
    mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    mProgressDialog.setCanceledOnTouchOutside(false);
}

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void download(String fileUrl, String filepath, String fileName,
                     Boolean visibility, Boolean choice) {
    // Make directories if required
    this.fileUrl=fileUrl;
    this.filepath=filepath;
    this.fileName=fileName;
    this.visibility=visibility;
    File f = new File(
            Environment.getExternalStoragePublicDirectory("/MDroid")
                    + filepath);
    if (!f.exists())
        f.mkdirs();


    if (choice == SYSTEM_DOWNLOADER) {

        String url=fileUrl;
        new MyAsyncTask().execute(url);

    } else {
        mdroidDownload(fileUrl, fileName);
        reqId =0;
    }

}

class MyAsyncTask extends AsyncTask<String, String, Void> {

    boolean running;


    @Override
    protected Void doInBackground(String...fUrl) {
        int count;


        InputStream input = null;
        OutputStream output = null;
        HttpURLConnection connection = null;
        try {

            URL url = new URL(fUrl[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            int lenghtOfFile = connection.getContentLength();

            // download the file
            input = connection.getInputStream();
            output = new FileOutputStream(
                    Environment.getExternalStorageDirectory() + "/MDroid/"
                            + fileName);

//#################################

    mydownload(fileUrl, filepath, fileName,
        visibility);


//##########################################

            byte data[] = new byte[4096];
            long total = 0;
            while ((count = input.read(data)) != -1) {
                total += count;
                publishProgress(""+(int)((total*100)/lenghtOfFile));
                output.write(data, 0, count);
            }

            output.close();
            input.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
return null;

    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        running = true;

        mProgressDialog.show();
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);

        mProgressDialog.dismiss();
    }

    protected void onProgressUpdate(String... progress) {

        // Update the progress dialog
        mProgressDialog.setProgress(Integer.parseInt(progress[0]));

    }


}




public long mydownload(String fileUrl,String filepath,String fileName,Boolean visibility)
{
    DownloadManager manager = (DownloadManager) context
            .getSystemService(Context.DOWNLOAD_SERVICE);

/* TODO- Offer better alternative. Only a temporary, quick,
 * workaround for 2.3.x devices. May not work on all sites.
 */
    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB)
        fileUrl = fileUrl.replace("https://", "http://");
    Request request = new Request(Uri.parse(fileUrl));
    try {
        request.setDestinationInExternalPublicDir("/MDroid", filepath
                + fileName);
    } catch (Exception e) {
        Toast.makeText(context, "External storage not found!",
                Toast.LENGTH_SHORT).show();
        return 0;
    }
    request.setTitle(fileName);
    request.setDescription("MDroid file download");

    // Visibility setting not available in versions below Honeycomb
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB)
        if (!visibility)
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);
        else
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

    // -TODO- save this id somewhere for progress retrieval
    reqId = manager.enqueue(request);
    return reqId;
}

2>I called this download method from DownloadTask.java class file into my fragment activity like this

// Download if file doesn't already exist
                if (!file.exists()) {
                    fileurl = content.getFileurl();

                    fileurl += "&token=" + session.getToken();
                    fName = content.getFilename();

                    //FROM HERE I AM CALLING ASYNCHRONOUS TASK

                    DownloadTask dt = new DownloadTask(context);
                    dt.download(fileurl, path, content.getFilename(), false,
                            DownloadTask.SYSTEM_DOWNLOADER);


                } else {

                    FileOpener.open(context, file);
                }


来源:https://stackoverflow.com/questions/40260810/how-to-use-asynchronous-task-for-download-progress-dialog-in-fragment

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!