【问题标题】:Progress bar in listview while AsyncTask file downloadAsyncTask 文件下载时列表视图中的进度条
【发布时间】:2011-10-29 03:23:33
【问题描述】:

我遇到了一个奇怪的问题,每当我在 webbrowser 上找到 MP3 文件时,我都会启动一个新的 asynctask,并在每个 AsyncTask 的列表视图中启动一个进度条。因此下载次数可以超过 1 次且同时下载。但是现在每当启动 Asynctask 时,ProgressBar 的移动对所有人都是一样的,而对于不同的 AsyncTask 并没有不同,请指导我......

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

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

private class DownloadFile extends AsyncTask<String, Integer, Void>{
    MyCustomAdapter adapter;

    int count = 0;
    ProgressDialog dialog;
    ProgressBar progressBar;
    int myProgress;

   @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/lengthOfFile)*100);
                myProgress = myProgress + myProgress;
                Log.i("lengthOfFile", Integer.toString(lengthOfFile));
                Log.i("My Progress", Integer.toString(myProgress));
                publishProgress(myProgress);
                fos.write(buffer, 0, len1);
            }
            fos.close();
            is.close();

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

    protected void onPostExecute() {
    }

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



    @Override
    protected void onProgressUpdate(Integer... values) {
         Log.i("Value", values[0].toString());
         count++;
         adapter.notifyDataSetChanged();
    }


    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);
                pb.setProgress(count);  
                return row;
            }
        }       
 }  

这是 AsyncTask 启动,它的 onCreate new DownloadFile().execute(url2.toString());

【问题讨论】:

    标签: android listview progress-bar android-asynctask


    【解决方案1】:

    另外,请在此处阅读有关 execute() 的注释:

    http://developer.android.com/reference/android/os/AsyncTask.html#execute%28Params...%29

    在 Honeycomb 之后,将只有一个线程运行所有 ASyncTask,因此您可能无法同时运行多个线程。在第一个之后,其余的将排队并且在第一个完成之前根本不会执行。您可能需要在 Thread 中执行每次下载并使用单个 ASyncTask 来监控所有下载。 (您也可以从线程进行监控,但您需要采取额外的步骤来安全地将更新发布到 UI 线程上的 UI)。

    【讨论】:

    【解决方案2】:

    你的问题是这个static ProgressBar pb;

    您不能拥有一个静态引用并期望控制多个进度条。将ProgressBar完全封装在AsyncTask内部,使其成为一个实例变量。

    编辑

    在 onProgressUpdate 中你需要改变 ProgressBar 的进度。您不需要为每一行都配备一个适配器,这很浪费。

    @Override
        protected void onProgressUpdate(Integer... values) {
             Log.i("Value", values[0].toString());
             count++;
             progressBar.setProgress(count);
        }
    

    你也从来没有给progressBar赋值,你一直在评估pb,去掉那个变量!在您的 PreExecute 中,您不断重新分配列表的适配器。

    您需要进行大量修改。创建一个管理列表视图的适配器。每行都可以有一个 AsyncTask 维护自己的进度条、图像视图和文本视图。

    【讨论】:

      猜你喜欢
      • 2011-10-27
      • 2014-01-12
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多