java - 无法同步线程android中的变量

标签 java android android-asynctask

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/

相关文章:

java - 向Java实现自定义add方法

javascript - 如何在 Nativescript 上设置 Android 状态栏的样式?

android - 频闪相机参数?为什么我的应用程序崩溃了?

android - AsyncTask 需要很长时间才能进入 doInBackground()

java - 将包含数据的文件解析为 Map<String, Date>

java - 在 Centos 而不是 Windows 上运行时,将 XML 转换为 JSON 会导致未知字符

java - 如何将esp8266 softAp与android应用程序连接

android.os.AsyncTask.THREAD_POOL_EXECUTOR

android - 如何创建我的 get Total Income Amount() 的 AsyncTask,它是我的 Income Dao 类中的 Integer 类型函数

java - Android 下载文件任务概念