0

모바일 앱의 성능을 개선하려고합니다. AsyncTask를 사용하려고합니다. AsyncTask에 대한 많은 문서를 살펴 보았습니다. 여기에 수많은 질문이 있지만 올바르게 실행하려면 코드를 가져올 수 없습니다.AsyncTask에서 setAdapter를 어디에서?

나는 어댑터가 onPostExecute 방법에 설정 한 예를 본 적이 있지만 그것은 onPreExecute에 MainActivity에 RecycleView을하지 정의 .. 나를 위해 작동

@Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_travel_updates); 



     Twitter.initialize(this); 

     new getTweets().execute(); 
    } 


private class getTweets extends AsyncTask<Void, Void, Void>{ 


    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
     recyclerView.setLayoutManager(new LinearLayoutManager(travel_updates.this)); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     final UserTimeline searchTimeline = new UserTimeline.Builder().screenName("TflTravelAlerts") 
       .maxItemsPerRequest(5) 
       .build(); 

     final TweetTimelineRecyclerViewAdapter tweetAdapter = 
       new TweetTimelineRecyclerViewAdapter.Builder(travel_updates.this) 
         .setTimeline(searchTimeline) 
         .setViewStyle(R.style.tw__TweetLightWithActionsStyle) 
         .build(); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void Void) { 

recyclerView.setAdapter(tweetAdapter); 

    } 
    } 
} 

감사

+0

* "하지만 저에게는 효과가 없습니다 .."* 우리가 당신을 도울 수 있도록 조금 더 설명 할 수 있습니까? – codeMagic

+0

예! 내 애매한 묘사에 사과! 받은 오류가 "recyclerView '기호를 확인할 수 없습니다." –

+0

다른 방법으로 선언되었습니다. 이 클래스가 모두 하나의 클래스라고 가정하면'onCreate()'에 선언하고 초기화 한 다음 지금 어댑터를 설정합니다. – codeMagic

답변

0

하지 않습니다 방법은 AsyncTask입니다.

onCreate 방법을 사용하면 RecyclerView을 설정할 수 있습니다.

private RecyclerView recyclerView; 


@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_travel_updates); 

    recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
    recyclerView.setLayoutManager(new LinearLayoutManager(travel_updates.this)); 

    Twitter.initialize(this); 

    new getTweets().execute(); 
} 

하면 (UI하면 동일한 스레드에없는)에있어서 내부 doInBackgroundUserTimelineTweetTimelineRecyclerViewAdapter이 때문에 doInBackground에 어댑터를 설정할 수 없다. UI 스레드에서 어댑터를 설정하십시오.

@Override 
protected Void doInBackground(Void... params) { 
    final UserTimeline searchTimeline = new UserTimeline.Builder().screenName("TflTravelAlerts") 
      .maxItemsPerRequest(5) 
      .build(); 

    final TweetTimelineRecyclerViewAdapter tweetAdapter = 
      new TweetTimelineRecyclerViewAdapter.Builder(travel_updates.this) 
        .setTimeline(searchTimeline) 
        .setViewStyle(R.style.tw__TweetLightWithActionsStyle) 
        .build(); 

    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      recyclerView.setAdapter(tweetAdapter); 
    }); 

    // I don't think you need to return anything if your method uses void?? 
    return null; 
} 

onPostExecute은 비어 있어야합니다.

+0

고마워, 지금은 완벽 해. .. AsyncTask는 나에게 처음이다. –

+0

@AaronStrickland :: 나는'UserTimeline' 또는'TweetTimelineRecyclerViewAdapter'를 한번도 사용하지 않았습니다. 그래서 당신은 데이터를 가져 오는 것에 대해 어떤 옵션을 사용할 수 없는지 (String, int, float ...). 보통, 당신은'onPostExecute' 메쏘드에 그 값들을 전달할 수 있습니다. onPostExecute 메소드는 UI Thread에서 작동합니다. – Barns