Pro*_*mer 6 android listview android-asynctask progress-bar
我有一个奇怪的问题,每当我在webbrowser上找到一个MP3文件时,我就会有一个新的asynctask launced,并且每个AsyncTask的列表视图中都有一个进度条.因此下载次数可以超过1次并同时进行.但是现在每当Asynctask推出时,ProgressBar会为所有人移动相同而且对于不同的AsyncTask没有什么不同,Plz引导我.......

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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是AsyncTask的开始,它的onCreate是新的DownloadFile().execute(url2.toString());
你的问题是这样的static ProgressBar pb;
您不能拥有单个静态引用并期望控制多个进度条。将ProgressBar完全封装在AsyncTask中,使其成为实例变量。
编辑
在 onProgressUpdate 中,您需要更改 ProgressBar 的进度。您不需要为每一行都配备一个适配器,这很浪费。
@Override
protected void onProgressUpdate(Integer... values) {
Log.i("Value", values[0].toString());
count++;
progressBar.setProgress(count);
}
Run Code Online (Sandbox Code Playgroud)
你也从来没有分配一个值progressBar,你不断评估pb,摆脱那个变量!在预执行中,您不断重新分配列表的适配器。
你需要大量的修改。创建管理列表视图的单个适配器。每行都可以有一个 AsyncTask,它维护自己的进度条、图像视图和文本视图。
| 归档时间: |
|
| 查看次数: |
10599 次 |
| 最近记录: |