0

モバイルアプリのパフォーマンスを向上させようとしています。 AsyncTaskを使用しようとしています。私はAsyncTaskに関する多くのドキュメントを見てきましたが、ここでは数多くの質問を見てきましたが、コードが正しく動作するように見えませんでした。AsyncTaskのどこのアダプターを設定しますか?

@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

これは別の方法で宣言されています。これがすべて1つのクラスであると仮定すると、 'onCreate()'で宣言して初期化し、今のようにアダプタを設定します。 – codeMagic

答えて

0

があなたのRecycleViewあなたMainActivityではないonPreExecuteで定義..私はアダプタがonPostExecute方式に設定されている例を見てきましたが、それは私のために動作しません。あなたの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と同じスレッド上ではありません)doInBackgroundメソッド内部UserTimelineTweetTimelineRecyclerViewAdapterを持っているので、あなたが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スレッドで動作します。 – Barns

関連する問題