使用具有特定位置的“循环进度”从服务器下载音频文件

时间:2022-08-15 10:07:23

I have created a music app with websrvice data. I get all data from a webservice and set it to listview and now I want to download the audio and store it in the sdcard.

我创建了一个包含websrvice数据的音乐应用程序。我从web服务获取所有数据并将其设置为listview,现在我想下载音频并将其存储在SD卡中。

I want to click on the download imageview and I want that imagview to change to a progressbar tand the file downloads. After file has downloaded I want the image to change but it is not.

我想点击下载imageview,我希望将imagview更改为进度条并下载文件。文件下载后,我想要更改图像,但事实并非如此。

How do I solve the problem?

我该如何解决这个问题?

public class DownloadTask extends AsyncTask<String, Integer, String> 
{
        Context context;

        private static final int MEGABYTE = 1024 * 1024;
        AudioRecyleviewAdapter.DownloadTask downloadTask;
        String Name;
        ProgressDialog mProgressDialog;
        ProgressBar progressBar;
        ImageView imgdowload;
        int position;

        public DownloadTask(Context context) {
            this.context = context;
        }


        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // mProgressDialog = new ProgressDialog(context);
            mProgressDialog = new ProgressDialog(context);
            mProgressDialog.setMessage("Downloading....");
            mProgressDialog.setIndeterminate(true);
            mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            mProgressDialog.setCancelable(false);

            mProgressDialog.show();

            mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialog) {

                    String sdcard_path = Environment.getExternalStorageDirectory().getPath();
                    File file = new File(sdcard_path + "/Petli Satsang/" + Name + ".mp3");
                    file.delete();
                    Toast.makeText(context, "Download In Background", Toast.LENGTH_SHORT).show();
                }
            });
        }

        @Override
        protected String doInBackground(String... str) {

            String URL = str[0];
            Name = str[1];
            InputStream input = null;
            OutputStream output = null;
            HttpURLConnection connection = null;
            try {
                java.net.URL url = new URL(URL);
                connection = (HttpURLConnection) url.openConnection();
                connection.connect();
                if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
                    return "Server returned HTTP " + connection.getResponseCode()
                            + " " + connection.getResponseMessage();
                }
                int fileLength = connection.getContentLength();
                input = connection.getInputStream();
                String sdcard_path = Environment.getExternalStorageDirectory().getPath();
                File PapersDiractory = new File(sdcard_path + "/Petli Satsang/");
                PapersDiractory.mkdirs();
                File outputFile = new File(PapersDiractory, "" + Name);
                output = new FileOutputStream(outputFile);

                byte data[] = new byte[MEGABYTE];
                long total = 0;
                int count;
                while ((count = input.read(data)) != -1) {
                    if (isCancelled()) {
                        input.close();
                        return null;
                    }
                    total += count;
                    if (fileLength > 0) // only if total length is known
                        publishProgress((int) (total * 100 / fileLength));
                    int progress = (int) (total * 100 / fileLength);
                    Log.d("Progress = ", "" + (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 onProgressUpdate(Integer... progress) {
            super.onProgressUpdate(progress);
            // if we get here, length is known, now set indeterminate to false
            mProgressDialog.setIndeterminate(false);
            mProgressDialog.setMax(100);
            mProgressDialog.setProgress(progress[0]);
            //progressBar.setProgress(Integer.parseInt(String.valueOf(progress[0])));

        }

        @Override
        protected void onPostExecute(String result) {
            mProgressDialog.dismiss();
            if (result != null)
                Toast.makeText(context, "Download error: " + result, Toast.LENGTH_LONG).show();
            else {
                int position = 0;
                Toast.makeText(context, "File downloaded", Toast.LENGTH_SHORT).show();
            }
        }
    }

//code to call function on dowload image cilck

//在dowload image cilck上调用函数的代码

 holder.download.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                File extStore = Environment.getExternalStorageDirectory();
                final File myFile = new File(extStore.getAbsolutePath() + "/Petli Satsang/" + detail.getTitle() + ".mp3");
                if (!myFile.exists()) {
                    if (isOnline()) {
                        DownloadTask downloadTask = new DownloadTask(context);
                        downloadTask.execute(Constant.ImagePath_audio1 + detail.getPath(), "" + detail.getTitle() + ".mp3");
                    } else {
                        try {
                            AlertDialog alertDialog = new AlertDialog.Builder(context).create();
                            alertDialog.setTitle("Info");
                            alertDialog.setMessage("Internet not available, Cross check your internet connectivity and try again");
                            alertDialog.setIcon(android.R.drawable.ic_dialog_alert);
                            alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {
                                    dialog.cancel();
                                }
                            });
                            alertDialog.show();
                        } catch (Exception e) {
                            //Log.d(Constants.TAG, "Show Dialog: " + e.getMessage());
                        }
                    }
                } else {
                    Toast.makeText(context, "File already Exists in " + myFile, Toast.LENGTH_SHORT).show();
                }

1 个解决方案

#1


0  

Pass your view to AsyncTask with setter getter or constructor in AsyncTask

使用AsterTask中的setter getter或构造函数将视图传递给AsyncTask

    this.clickedRowView = clickedRowView;
    public DownloadTask(Context context,View clickedRowView) {
        this.context = context;
        this.clickedRowView = clickedRowView;
    }

Call your DownloadTask inside onclick like

在onclick中调用你的DownloadTask就像

//v comes from onClick method which points to holder.download view.
DownloadTask downloadTask = new DownloadTask(context,v);
v.setVisibility(View.INVISIBLE);//make Image View invisible and display progressbar

((RelativeLayout)v.getParent()).findViewById(R.id.progressBar).setVisibility(View.VISIBLE);// make progressbar to visible

Now you hold your view into the asynctask, now you should change your image view after download successes or fails

现在您将视图保存到asynctask中,现在您应该在下载成功或失败后更改图像视图

    @Override
    protected void onPostExecute(String result) {
        mProgressDialog.dismiss();
        clickedImageView.setVisibility(View.VISIBLE);
        ((RelativeLayout)v.getParent()).findViewById(R.id.progressBar).setVisibility(View.INVISIBLE);// make progressbar to invisible **EDIT 1**
        if (result != null)
            Toast.makeText(context, "Download error: " + result, Toast.LENGTH_LONG).show();
        else {
            int position = 0;
            Toast.makeText(context, "File downloaded", Toast.LENGTH_SHORT).show();
        }
        if(clickedRowView != null){
             //You can reach your holder view in here! if this is image view just set image with ((ImageView)clickedRowView).setImageBitmap(...); etc..
        }
    }

EDIT 1 : If you want to make your Image View invisible and make Progress Bar visible, you should put them into same ViewGroup and setVisibility to right state.
And change xml file which holds ImageView like this:

编辑1:如果要使图像视图不可见并使进度条可见,则应将它们放入相同的ViewGroup并将setVisibility置于正确状态。并更改包含ImageView的xml文件,如下所示:

<RelativeLayout 
  android:id="@+id/imageAndProgressContainer"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
    <ImageView 
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="visible"/>
    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible"/>
  </RelativeLayout>

#1


0  

Pass your view to AsyncTask with setter getter or constructor in AsyncTask

使用AsterTask中的setter getter或构造函数将视图传递给AsyncTask

    this.clickedRowView = clickedRowView;
    public DownloadTask(Context context,View clickedRowView) {
        this.context = context;
        this.clickedRowView = clickedRowView;
    }

Call your DownloadTask inside onclick like

在onclick中调用你的DownloadTask就像

//v comes from onClick method which points to holder.download view.
DownloadTask downloadTask = new DownloadTask(context,v);
v.setVisibility(View.INVISIBLE);//make Image View invisible and display progressbar

((RelativeLayout)v.getParent()).findViewById(R.id.progressBar).setVisibility(View.VISIBLE);// make progressbar to visible

Now you hold your view into the asynctask, now you should change your image view after download successes or fails

现在您将视图保存到asynctask中,现在您应该在下载成功或失败后更改图像视图

    @Override
    protected void onPostExecute(String result) {
        mProgressDialog.dismiss();
        clickedImageView.setVisibility(View.VISIBLE);
        ((RelativeLayout)v.getParent()).findViewById(R.id.progressBar).setVisibility(View.INVISIBLE);// make progressbar to invisible **EDIT 1**
        if (result != null)
            Toast.makeText(context, "Download error: " + result, Toast.LENGTH_LONG).show();
        else {
            int position = 0;
            Toast.makeText(context, "File downloaded", Toast.LENGTH_SHORT).show();
        }
        if(clickedRowView != null){
             //You can reach your holder view in here! if this is image view just set image with ((ImageView)clickedRowView).setImageBitmap(...); etc..
        }
    }

EDIT 1 : If you want to make your Image View invisible and make Progress Bar visible, you should put them into same ViewGroup and setVisibility to right state.
And change xml file which holds ImageView like this:

编辑1:如果要使图像视图不可见并使进度条可见,则应将它们放入相同的ViewGroup并将setVisibility置于正确状态。并更改包含ImageView的xml文件,如下所示:

<RelativeLayout 
  android:id="@+id/imageAndProgressContainer"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
    <ImageView 
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="visible"/>
    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible"/>
  </RelativeLayout>