doInBackground中的新线程:它会影响性能吗?

时间:2015-03-27 17:24:27

标签: java android multithreading file android-asynctask

如果我在doInBackground的{​​{1}}方法中开始一个新线程,从性能的角度来看是否可以? 我写了一个从服务器下载文件的小程序。该方法在AsyncTask内运行。现在,为了找出下载文件的当前大小,我启动一个新线程,它读取被管道传输到本地doInBackground对象的字节数。我需要这个来发布下载百分比。以下是代码段:

File

该程序运行正常,但似乎下载速度比它应该慢一点。是否与在@Override protected Void doInBackground(Void... params) { try { client.download(dir + "/" + component0, new java.io.File( Environment.getExternalStorageDirectory() + "/" + component0)); Thread trd = new Thread(new Runnable() { @Override public void run() { while (tempfile.length() != filesize) { if (tempfile.length() * 100 / filesize != percent) { percent = (int) (tempfile.length() * 100 / filesize); publishProgress(percent); } } } }); trd.start(); } catch (IllegalStateException | IOException | FTPIllegalReplyException | FTPException | FTPDataTransferException | FTPAbortedException e) { e.printStackTrace(); } return null; } 方法中创建的新Thread有关?

1 个答案:

答案 0 :(得分:1)

不要这样做,我认为它不会以用户可以分辨的方式影响性能,但这只是不好的做法。而是使用Handler类函数postDelay,它在这里描述: http://developer.android.com/reference/android/os/Handler.html#postDelayed(java.lang.Runnable,长)

你可以将函数调用延迟到X秒,并在每次下载完成时再次调用它:

Handler h = new Handler();
void doWork() {
        h.postDelayed(new Runnable() {

            @Override
            public void run() {
                // do work here...
                if (!finish) {
                    doWork();
                }
            }
        }, 1000);
}