【问题标题】:New thread inside doInBackground: Will it impact the performance?doInBackground 中的新线程:它会影响性能吗?
【发布时间】:2015-03-27 17:24:27
【问题描述】:

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

@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;
}

该程序运行良好,但下载速度似乎比应有的慢了一点。是否与在 doInBackground 方法中创建的新 Thread 有关?

【问题讨论】:

  • 你知道在 doinbackground 中启动另一个线程没有意义吗?
  • 我明白这一点,但不幸的是,我无法知道本地设备上的文件大小。我的问题是,它会影响 doInBackground 的性能吗?
  • 如果可行的话,为什么不计算下载的字节数,而不是检查文件大小?不,它不会产生性能差异,只要您不经常运行第二个线程

标签: java android multithreading file android-asynctask


【解决方案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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 2016-09-26
    • 2019-09-09
    • 1970-01-01
    • 2021-04-29
    • 2012-02-04
    • 2011-01-28
    相关资源
    最近更新 更多