2017-09-14 3 views
0

나는 asynctask과 gui 물건을하려고했지만 모든 장치에서 작동하지 않습니다. 왜?백그라운드에서 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 작업을 수행하는 가장 좋은 방법은 무엇입니까?

+2

백그라운드에서 UI 작업을 수행 할 수 없으며 해당 코드로도 UI 작업을 수행 할 수 없습니다. onPostExecute는 UI 스레드에서 실행됩니다. –

+0

@TimCastelijns OP가 onPostExecute에서 호출하는 메서드가 백그라운드에서 실행되지 않도록 호출합니다. –

+0

자세히 설명해주십시오. "그렇지 않다"는 의미입니다. 디버거를 사용하거나 문장을 기록 할 때 무슨 일이 일어나고 있는지 알기 위해 무엇을 배웠습니까? 왜 처음에는 AsyncTask를 사용하고 있습니까? 디스크 I/O 또는 네트워크 I/O가 진행되지 않습니다. – CommonsWare

답변

-1

플랫폼간에 AsyncTask가 다소 일치하지 않습니다. 그들은 더 많은 컨트롤을 제공

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

그러나 나는 오히려 스레드 풀을 사용하십시오 : onPostExecute이보십시오.

+1

* AsyncTask는 플랫폼간에 다소 일치하지 않습니다. * 해당 진술을 백업 할 소스가 있습니까? –

+0

나는 이것을 시험해 보았다. 더 원활하게 실행됩니다! – ubik

+0

아니, 2.2 시대의 여러 기기에서 테스트하는 동안 일반적인 경험이었습니다. 이 데이터는 오래된 것일 수 있으며 잘못되었을 수도 있지만 AsyncTasks는 실제로 두려워요. – cab404