私は私の最初のAndroidアプリをやっています。ページの1つで、RESTサービスを使用してDrupalサイトに接続し、いくつかのデータ(ビデオのURL、タイトル、説明などのリスト)を取得して、リストに表示する必要があります。リストをクリックすると、ビデオの詳細に移動します。
これが私が進めたい方法です。1°Drupalサイトからすべてのデータを取得します。2°リストの項目をクリックすると、そのビデオの詳細が次のアクティビティに渡されます。
問題はこれです:アンドロイド3+でインターネットに接続するとき、あなたはメインスレッドでそれをすることができないので、私はデータを取得するためにAsyncTaskを使わなければなりませんでした。これは機能しましたが、ビデオをArrayListに保存してから、getVideos()またはgetVideo(index)関数を使用してそのリストにアクセスします。最初にリストにデータを入力し、2番目に詳細アクティビティに進む前にデータを取得します。問題は、ビデオのリストにアクセスしようとしたときに、リストがまだ入力されていないことです。
技術的には、非同期タスクを使用する必要はありませんが、メインスレッドでインターネットに接続すると、適切な方法ではないというエラーがスローされます。
これが私がビデオを取得する方法の簡略版です:
public class VideoDaoImpl {
private List<Video> videos ;
public VideoDaoImpl (){
videos = new ArrayList<Video>();
new VideoTask(...).execute(); //fetch the videos in json format and
//call function onRemoteVideoCallComplete using a handler
//in the onPostExecute() function of the asyncTask
}
public List<Video> getVideos() {
return videos;
}
public Video getVideo(int index){
return videos.get(index);
}
public onRemoteVideoCallComplete(JSONObject json) {
//transform Json into videos and add them to the videos arraylist
}
}
これは私が私の活動でビデオリストを埋めたい方法です:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_videos_list);
//get all videos (not yet filled since faster than second thread)
List<Video> videos = videoDao.getVideos();
//get a list of all the titles to display as the list
List<String> formattedVideos = VideoHelper.formatVideosList(videos);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, formattedVideos);
ListView listView = (ListView) findViewById(R.id.videos_list);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new VideosListItemClickListener(this));
}
だから問題は本当にこれです。これを行うためのより良い方法はありますか、それともリストがいっぱいになるのを待つ方法がありますか。