私はダウンロードマネージャープロジェクトに取り組んでいるので、ダウンロード/ダウンロードアクションをすべて表示するには、ListViewを使用してダウンロードリストを表示することを好みます。ダウンロードタスクと同じ数があるとすると、すべてのタスクのプログレスバーを更新する必要があります。バックグラウンドダウンロードタスクのために、名前を付けた新しいクラスを作成しましたHttpDownloader
。したがって、このクラスのオブジェクトにこれらのプログレスバーを渡します。新しいオブジェクトがタスクリストに追加されると、のコンストラクターを呼び出してHttpDownloader
、新しいアイテムの進行状況バーをそのオブジェクトに渡します。私を混乱させたのはWhen i add a new object to tasklist and call notifyDataSetChanged of adapter, my list is refreshed, so all progress bar reset to default layout values but HTTPDownloader Thread is running in background successfully.
それで、それは私の質問です、
1. notifyDataSetChangedを呼び出した後、古いリストビューのオブジェクトへの参照は破棄されますか?
2.はいの場合、古いビューの参照を保持するにはどうすればよいですか?
3.いいえの場合、プログレスバーがデフォルトにリセットされ、バックグラウンドプロセスがプログレスバーを通過してプログレスの値を変更しても変更されない理由を説明してください。
HTTPDownloader class
class HttpDownloader implements Runnable {
public class HttpDownloader (String url, ProgressBar progressBar)
{
this.M_url = url;
this.M_progressBar = progressBar;
}
@Override
public void run()
{
DefaultHttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(this.M_url);
HttpResponse response;
try{
response = client.execute(get);
InputStream is = response.getEntity().getContent();
long contentLength = response().getEntity().getContentLength();
long downloadedLen = 0;
int readBytes = 0;
byte [] buffer = new byte [1024];
while ((readBytes = in.read(buffer, 0, buffer.length)) != -1) {
downloadedLen += readBytes;
//Some storing to file codes
runOnUiThread(new Runnable() {
@Override
public void run() {
M_progressBar.setProgress((100f * downloadedLen) / contentLength);
}
});
}
is.close();
} catch (ClientProtocolException e) {
Log.e("HttpDownloader", "Error while getting response");
} catch (IOException e) {
Log.e("HttpDownloader", "Error while reading stream");
}
}
}
AdapterClass
class MyAdapter extends ArrayAdapter<String> {
ArrayList<String> M_list;
public MyAdapter(ArrayList<String> list) {
super(MainActivity.this, R.layout.download_item, list);
this.M_list = list;
}
@Override
public int getCount() {
return this.M_list.size();
}
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.download_item, parent, false);
ProgressBar bar = (ProgressBar) rowView.findViewById(R.id.progrees);
new Thread (new HttpDownloader(this.M_list.get(position), bar)).start();
return rowView;
}
}