【问题标题】:How to do GUI stuff in background? (Android)如何在后台做 GUI 的东西? (安卓)
【发布时间】:2017-09-14 12:44:10
【问题描述】:

我尝试用asynctask 做gui 的东西,但它并不适用于所有设备。为什么?

这是我的代码:

public class DownloadWebPageTask extends AsyncTask<ReadEvent, Void, String> {

    long difference;
    ReadEvent readevent;

    @Override
    protected String doInBackground(ReadEvent... readevents) {
        this.difference = (readevents[0].getDtstart() - calendar_millis) / 1000 / 24 / 60 / 60;
        this.readevent = readevents[0];

        return "";
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        MonthFragment.this.addDate((int) difference + MonthFragment.this.start - 1, readevent.getEventname(), readevent.getCalendarid(), readevent.getEventcolor());
    }
}

这是在fragment 内。 addDate 方法将TextView 添加到GUI。它在 Honor Huawei 6X Honor (Android 7.0) 上运行良好。在 BQ Aquaris X5 (Android 7.1.1) 上没有。

在后台做 GUI 的最好方法是什么?

【问题讨论】:

  • 您不能在后台执行 (G)UI 的操作,而且您也没有使用该代码执行此操作。 onPostExecute 在 UI 线程上运行
  • @TimCastelijns OP 所说的方法是从 onPostExecute 调用的,因此它不在后台。
  • 请详细解释“它不”是什么意思。当您使用调试器或记录语句来查看发生了什么时,您学到了什么?你为什么首先在这里使用AsyncTask?没有磁盘 I/O 或网络 I/O 正在进行。
  • @CommonsWare:我有一个浏览器。当我滚动时,它应该在加载片段之前加载数据。
  • 这并不能解释你为什么在这里使用AsyncTask

标签: java android android-viewpager android-gui


【解决方案1】:

AsyncTask 在平台之间相当不一致。在onPostExecute 试试这个:

if (getView() != null)
    getView().post(new Runnable() {
        public void run() {
            MonthFragment.this.addDate((int) difference + MonthFragment.this.start - 1, readevent.getEventname(), readevent.getCalendarid(), readevent.getEventcolor());
        }
    });

但我宁愿使用线程池,它们提供了更多的控制。

【讨论】:

  • AsyncTask 在平台之间是相当不一致的。你有一些资源来支持这个声明吗?
  • 不,只是我在 2.2 时代在几台设备上测试它时的一般经验。这个数据可能已经过时了,我可能错了,但是从那以后我真的很害怕AsyncTasks)
  • @ubik 这种实现可能会导致内存泄漏。
  • @WadeWilson 加油,他已经在 AsyncTask 中获得了他的片段的引用。这并没有更糟,尤其是在像这样的短期任务的情况下。
  • @cab404,仅仅因为他已经有参考并不意味着它是正确的。如果他确保在 Fragment 停止时取消任务,这不会导致内存泄漏,如果没有,并且 Fragment 被销毁,他将泄漏内存。在 Activity/Fragment 中创建匿名处理程序时也是同样的问题。我只是通知他,因为它很容易引入错误,以后追踪起来可能很烦人。特别是如果他在整个应用程序中重复使用这种模式。
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
相关资源
最近更新 更多