Boolean timer = false;
@Override
protected Boolean doInBackground(String... params) {
// TODO Auto-generated method stub
downloadmanagerstart();
System.out.println("return");
boolean downloading = true;
while (downloading) {
DownloadManager.Query q = new DownloadManager.Query();
q.setFilterById(download_id);
Cursor cursor = downloadManager.query(q);
cursor.moveToFirst();
int bytes_downloaded = cursor
.getInt(cursor
.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
int bytes_total = cursor
.getInt(cursor
.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
if (cursor.getInt(cursor
.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL) {
downloading = false;
}
cursor.close();
publishProgress(bytes_downloaded, bytes_total);
}
return true;
}
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
final int bytes_downloaded = values[0];
System.out.println(bytes_downloaded
+ " Downloaded 1");
int bytes_total = values[1];
int dl_progress = (int) ((bytes_downloaded * 100l) / bytes_total);
String totaldownload_str = android.text.format.Formatter
.formatFileSize(MainActivity.this, bytes_downloaded);
current_tvm.setText(totaldownload_str);
mProgressBar.setProgress((int) dl_progress);
if (!timer) {
Thread thread = new Thread() {
@Override
public void run() {
t = new Timer();
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
runOnUiThread(new Runnable() {
public void run() {
System.out.println(bytes_downloaded
+ " Downloaded 2");
}
});
}
}, 0, 1000);
}
};
thread.start();
timer = true;
}
}
如你所见,我在 onProgress 中放置了两个 System.out.println(bytes_downloaded+ "Downloaded 1");
和 System.out.println(bytes_downloaded+ "Downloaded 2");
在 onProgress 的线程内。线程内 bytes_downloaded
的值始终为 0,为什么会发生这种情况。我希望它每秒与 onProgress 中的值 bytes_downloaded
同步。提前致谢。
最佳答案
它是 0,因为它是一个最终变量。一旦设定,就无法更改。因此它始终是您最初设置的值。如果您想传递这样的数据,请使用类的成员变量(必要时进行同步),而不是最终变量或方法级变量。
此外,不需要这种方法。 onProgressUpdate 已经在 UI 线程上运行 - 这就是该函数的重点。为什么你想要更多地延迟 UI 更新,为什么你会使用如此复杂的方式来做到这一点?我认为你真的不理解线程、定时器和AsyncTasks如何工作的概念,因为这段代码没有任何意义。
关于java - 无法同步线程android中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27674962/