2017-09-14 84 views
0

我試圖用asynctask做gui的東西,但它不適用於每個設備。爲什麼?如何在後臺做GUI的東西? (Android)

這裏是我的代碼:

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。它對榮譽華爲6X榮譽(Android 7.0)非常有用,它的效果非常好。在BQ Aquaris X5(Android 7.1.1)上沒有。

什麼是最好的辦法,在後臺做GUI的東西?

+2

你不能在背景中做(G)UI的東西,而且你也沒有用它做代碼。 onPostExecute在UI線程上運行 –

+0

@TimCastelijns OP所講的方法是從onPostExecute調用的,所以它不在後臺。 –

+0

請詳細解釋「它不」的含義。當您使用調試器或日誌記錄來查看發生了什麼時,您學到了什麼?你爲什麼首先在這裏使用'AsyncTask'?沒有磁盤I/O或網絡I/O正在進行。 – CommonsWare

回答

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

但我寧願使用線程池,他們提供更多的控制。

+1

* AsyncTask在平臺之間相當不一致。*您有一些備份該語句的來源? –

+0

我試過了。它運行更順利! – ubik

+0

nope,只是一般的經驗,而我在2.2時代的幾款設備上測試它。這個數據可能已經過時了,我可能是錯的,但是自那時起我真的很害怕AsyncTasks) – cab404