Java 如何在后台进行GUI工作?(安卓)

Java 如何在后台进行GUI工作?(安卓),java,android,android-viewpager,android-gui,Java,Android,Android Viewpager,Android Gui,我尝试使用asynctask来实现gui功能,但它并不能在所有设备上运行。为什么? 这是我的密码: public class DownloadWebPageTask extends AsyncTask<ReadEvent, Void, String> { long difference; ReadEvent readevent; @Override protected String doInBackground(ReadEvent... reade

我尝试使用
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());
    }
}
公共类下载WebPagetTask扩展异步任务{
长差;
ReadEvent-ReadEvent;
@凌驾
受保护的字符串doInBackground(ReadEvent…readevents){
this.difference=(readevents[0].getDtstart()-calendar_millis)/1000/24/60/60;
this.readevent=readevents[0];
返回“”;
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
MonthFragment.this.addDate((int)差+MonthFragment.this.start-1,readevent.getEventname(),readevent.getCalendarid(),readevent.getEventcolor());
}
}
这在
片段中。addDate方法将
TextView
添加到GUI中。它在Honor上非常有效华为6X Honor(安卓7.0)非常有效。在BQ Aquaris X5(安卓7.1.1)上,它没有


在后台做GUI工作的最佳方式是什么?

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());
        }
    });

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

你不能在后台做(G)UI的事情,你也不能用这些代码来做。onPostExecute在UI上运行thread@TimCastelijnsOP所说的方法是从onPostExecute调用的,因此它不在后台。请详细解释“它不”的含义。当您使用调试器或日志语句查看发生了什么时,您学到了什么?首先,为什么要在这里使用
AsyncTask
?没有磁盘I/O或网络I/O。@Commonware:我有一个viewpager。当我滚动时,它应该在片段加载之前加载数据。这并不能解释为什么在这里使用
AsyncTask
。AsyncTask在平台之间相当不一致。你有什么资料支持这一说法吗?没有,只是我在2.2时代的几个设备上测试它时的一般经验。这些数据可能已经过时,我可能错了,但我真的很害怕AsyncTasks(从那时起)@ubik此实现可能会导致内存泄漏。@WadeWilson拜托,他已经在AsyncTask中找到了他的片段的引用。这并不是更糟,尤其是在这样的短任务中。@cab404,仅仅因为他已经有了一个引用并不意味着它是正确的。这不会导致内存泄漏,如果他确保在片段停止时取消任务,如果没有,并且片段被销毁,他将泄漏内存。在活动/片段中创建匿名处理程序时也会遇到同样的问题。我只是通知他,因为这是一个很容易引入的bug,以后追踪起来可能会很烦人。尤其是如果他在整个应用程序中重复使用此模式。