mp3文件通过asynctask下载并具有进度条listview android

时间:2011-08-13 18:50:03

标签: android listview mp3 progress-bar android-asynctask

我有一个异步任务

new DownloadFile()。execute(url2.toString());

我什么时候在网址上找到一个mp3文件,例如www.xyz.com/preview.mp3

我调用上面的异步任务

new DownloadFile()。execute(url2.toString());

然后我在列表视图中也有一个进度条,但现在进度条没有更新 我使用自定义适配器并正确地充气了视图。

                 public class CopyOfDownloadsListActivity extends ListActivity {
                /** Called when the activity is first created. */

                //  static ArrayList<String> pthreads = new ArrayList<String>();
                static ImageView bt;
                static ProgressBar pb;
                static ListView allList;
                static TextView tv;
                String fileName;
                String mp3URL;
                URL url2;
                int myProgress;
                static int filecount  = 0;
                MyCustomAdapter adapter;

                private class DownloadFile extends AsyncTask<String, Integer, Void>{
                    int count = 0;
                    ProgressDialog dialog;
                    int myProgess = 0;
                    ProgressBar progressBar;

                    @Override
                    protected Void doInBackground(String... u) {

                        try {                   
                            URL ul = new URL(u[0]);
                            Log.i("UI",ul.toString());
                       //   int len = CopyOfMusicDownloader.mp3urls.size();
                       //   URL url2 = new URL(CopyOfMusicDownloader.mp3urls.get(len-1));
                            HttpURLConnection c = (HttpURLConnection) ul.openConnection();
                            c.setRequestMethod("GET");
                            c.setDoOutput(true);
                            c.connect();

                            int lengthOfFile = c.getContentLength();

                            String PATH = Environment.getExternalStorageDirectory()
                                    + "/download/";
                            Log.v("", "PATH: " + PATH);
                            File file = new File(PATH);
                            file.mkdirs();

                            fileName = "Track";
                            filecount++;

                            fileName =  fileName + Integer.toString(filecount) + ".mp3";


                            File outputFile = new File(file, fileName);
                            FileOutputStream fos = new FileOutputStream(outputFile);
                            InputStream is = c.getInputStream();

                            byte[] buffer = new byte[1024];
                            int len1 = 0;      
                            while ((len1 = is.read(buffer)) != -1) {
                                myProgress = (int)(len1*100/lengthOfFile);
                                //myProgress = (int)(len1);

                                Log.i("My Progress", Integer.toString(myProgress));
                                publishProgress(myProgress);
                                //  publishProgress((int)(len1*100/lengthOfFile));
                                fos.write(buffer, 0, len1);
                            }
                            fos.close();
                            is.close();

                            }catch (IOException e) {
                                   e.printStackTrace();
                            }
                        return null;
                    }

                    protected void onPostExecute() {

                    }

                    @Override
                    protected void onPreExecute() {
                          setListAdapter(new MyCustomAdapter(CopyOfDownloadsListActivity.this, R.layout.row, CopyOfMusicDownloader.mp3urls));

                    }



                    @Override
                    protected void onProgressUpdate(Integer... values) {
                         pb.setProgress(count);// HERE IS THE PROBLEM

                         count++;
                         Log.i("Values", Integer.toString(values[0]));
                    }
                 }  

                @Override
                public void onCreate(Bundle savedInstanceState) {
                    requestWindowFeature(Window.FEATURE_NO_TITLE);
                    super.onCreate(savedInstanceState);

                    int len = CopyOfMusicDownloader.mp3urls.size();
                    try {
                        url2 = new URL(CopyOfMusicDownloader.mp3urls.get(len-1));
                        new DownloadFile().execute(url2.toString());
                        Log.i("url",url2.toString());
                    } catch (MalformedURLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                 }

                @Override
                public boolean onCreateOptionsMenu(Menu menu) {
                     MenuInflater myMenuInflater = getMenuInflater();
                     myMenuInflater.inflate(R.menu.menu, menu);
                    return true;
                }

                @Override
                public boolean onOptionsItemSelected(MenuItem item) {
                     switch(item.getItemId()){
                     case(R.id.browsermenu):
                     Intent i = new Intent(CopyOfDownloadsListActivity.this, MusicDownloader.class);  
                     startActivity(i);
                     break;
                     case(R.id.downloaderrmenu):      
                     break; 
                     case(R.id.playermenu):
                     Intent j = new Intent(CopyOfDownloadsListActivity.this, Players.class);  
                     startActivity(j);
                    break;
              }
                 return true;
                }


                public class MyCustomAdapter extends ArrayAdapter<String> {     
                    public MyCustomAdapter(Context context, int textViewResourceId, ArrayList<String> pthreads) {
                    super(context, textViewResourceId, pthreads);
                    }

                    @Override
                    public View getView(int position, View convertView, ViewGroup parent) {
                            LayoutInflater inflater = getLayoutInflater();
                            View row = inflater.inflate(R.layout.row, parent, false);
                            bt =(ImageView)row.findViewById(R.id.cancel_btn);
                            tv =(TextView)row.findViewById(R.id.filetext);
                            pb = (ProgressBar)row.findViewById(R.id.progressbar_Horizontal);
                            return row;
                        }
                    }


            }

3 个答案:

答案 0 :(得分:1)

是你在寻找什么?

private class DownloadFile extends AsyncTask<String, Integer, Void> {
    ProgressBar progressBar;
    public DownloadFile(ProgressBar progressBar) {
        this.progressBar=progressBar;
    }


    @Override
    protected void onProgressUpdate(Integer... values) {
        progressBar.setProgress(count);
    }

}

现在,每个DownloadFile Task都有自己的ProgressBar

答案 1 :(得分:0)

认为这就是问题(我没有测试你的代码

 myProgress = (int)(len1*100/lengthOfFile);

这必须看起来像这样

 myProgress += (int)(len1*100/lengthOfFile);

答案 2 :(得分:0)

我知道这个问题很老,但有人可能会像我一样。这是我的代码。也许这不是最好的方法,但我需要尽快使其工作。 我的适配器元素

<强> ChatRow

public class ChatRow {
    private int progressCount;
    private boolean sending;

        public boolean isSending()
        {
            return sending;
        }

        public void setSending(boolean sending)
        {
            this.sending = sending;
        }

            public int getProgressCount() {
                return progressCount;
            }

            public void setProgressCount(int progressCount) {
                this.progressCount = progressCount;
            }
}

在我的适配器的getView方法上我有这部分代码

if (row.isSending()) {
    holder.progressBar.setVisibility(View.VISIBLE);
    holder.progressBar.setProgress(row.getProgressCount());
}

这就在我的AsyncTask上 的 SendFileTask

private class SendFileTask extends AsyncTask<String, Integer, Boolean> {
    private ChatRow row;

    public SendFileTask(int rowNumber) {
        this.row = adapter.getItem(rowNumber);
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        Logger.d(String.format("progress[%d]", values[0]));
        row.setProgressCount(values[0]);
        adapter.notifyDataSetChanged();
    }

    @Override
    protected void onPostExecute(Boolean result) {
        row.setSending(false);
        row.setProgressCount(0);
        adapter.notifyDataSetChanged();
    }