1

私は私の最初の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));
    }

だから問題は本当にこれです。これを行うためのより良い方法はありますか、それともリストがいっぱいになるのを待つ方法がありますか。

4

2 に答える 2

2

AsyncTaskはそのままにしておきますが、onPostExecute()を利用することを検討します。onPostExecute()内で、Jsonをビデオオブジェクトのリストに変換し、これからフォーマットされたビデオのリストを作成します。次に、フォーマットされたビデオのリストをアクティビティに戻すメソッドを呼び出して、リストを設定できます。

たとえば、非同期の内部:

protected void onPostExecute(Json result) {
     //Create list of videos from json
     //Create formatted list
     //call method in activity to set list e.g activity.setList(formatted List)
 }
于 2012-11-26T15:47:01.103 に答える
0

あなたのアプローチを使用すると、期待される動作があなたが直面しているものになります。つまり、ビデオリストはまだいっぱいになりません。あなたは非同期アプローチを使用して問題に対処していますが、同期的に考えています。 「2番目のスレッドよりも速いのでまだ埋められていない」というコメントに基づいて、それを知っています。

videoDao.getVideos();

onPostExecuteメソッドで、またはその後に呼び出す必要があります。私はそのようなことをします、それをドラフトと考えてください、完全な解決策ではありません。

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_videos_list);
    new VideoTask(...).execute(); // you should a use a something on your onPreExecute() inside this task showing a ProgressDialog so the user knows that something is "loading videos, please wait"

    List<Video> videos = videoDao.getVideos();
    if (!videos.isEmtpy()) {
      //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));
    }
}

基本的に、違いとして示されているのは、VideoDAOからAsyncTaskを抽出できることです。ProgressDialogを使用して実行し、何かが進行中であることを通知してから、ビデオリストがいっぱいになっているかどうかを確認します。そうであった場合は、videos_listに動画を表示します。もちろん大まかなドラフトですが、理解できると思います。

于 2012-11-26T15:29:00.890 に答える