我对Java 非常陌生,并且大部分时间都在教我自己,所以我开始构建一个applet.我想创建一个可以从本地磁盘中选择文件并将其作为multipart/form-data POST请求上传但有进度条的文件.显然,用户必须授予Java applet访问硬盘驱动器的权限.现在我已经完成了第一部分工作:用户可以使用JFileChooser对象选择一个文件,方便地返回一个File对象.但我想知道接下来会发生什么.我知道这File.length()将给我文件的总大小(以字节为单位),但是如何将所选内容发送File到网络,以及如何监控已发送的字节数?提前致谢.
我正在尝试ListView使用下载任务列表创建一个.
下载任务在Service(DownloadService)中管理.每次接收到一大块数据时,任务通过a发送进度Broadcast,由Fragment包含ListView(SavedShowListFragment)的接收.收到Broadcast消息后,SavedShowListFragment将更新适配器和触发器中下载任务的进度notifyDataSetChanged().
列表中的每一行都包含a ProgressBar,a TextView表示正在下载的文件的标题,1表示进度的数值,a Button表示下载完成时暂停/恢复下载或播放保存的节目.
问题是暂停/恢复/播放Button通常没有响应(onClick()没有被调用),我认为这是因为整个列表都经常更新notifyDataSetChanged()(每次都有一大块数据,即收到1024字节,这可能是每秒多次,特别是当有多个下载任务正在运行时).
我想我可以在下载任务中增加数据块的大小,但我真的认为我的方法根本不是最优的!
可以经常打电话notifyDataSetChanged()让ListViewUI无响应吗?
有什么办法只更新一些Views的ListView行,即在我的情况ProgressBar和TextView与进步的数值,而不调用notifyDataSetChanged(),这将更新整个清单吗?
要更新下载任务的进度ListView,有没有比"getChunk/sendBroadcast/updateData/notifyDataSetChanged"更好的选项?
以下是我的代码的相关部分.
下载服务中的下载任务
public class DownloadService extends Service {
//...
private class DownloadTask extends AsyncTask<SavedShow, Void, Map<String, Object>> {
//...
@Override
protected Map<String, Object> doInBackground(SavedShow... params) {
//...
BufferedInputStream in = …Run Code Online (Sandbox Code Playgroud) 我想创建一个类似于这个的服务(从这里引用),以便在Android中异步下载多个文件.
public static class DownloadingService extends IntentService {
public static String PROGRESS_UPDATE_ACTION = DownloadingService.class
.getName() + ".newDownloadTask";
private ExecutorService mExec;
private CompletionService<NoResultType> mEcs;
private LocalBroadcastManager mBroadcastManager;
private List<DownloadTask> mTasks;
public DownloadingService() {
super("DownloadingService");
mExec = Executors.newFixedThreadPool( 3 ); // The reason to use multiple thread is to download files asynchronously.
mEcs = new ExecutorCompletionService<NoResultType>(mExec);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
protected void onHandleIntent(Intent intent) {
while(true)
{ …Run Code Online (Sandbox Code Playgroud) java multithreading android android-download-manager android-intentservice