如果我在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
有关?
答案 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);
}