0

Android Asynchronous Http Client を使用して HTTP リクエストを処理し、ListView に持っている JSON フィードのコンテンツを入れようとしています。ただし、リクエストの性質により、アダプターは、null必要なデータの配列ではなく値を受け取ると思います。

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

    ApplicationGlobal g = (ApplicationGlobal) getApplication();
    boolean userLoggedIn = g.getUserLoggedIn();
    AsyncHttpClient clientSession = new AsyncHttpClient();
    PersistentCookieStore cookieStore = g.getCookieStore();
    clientSession.setCookieStore(cookieStore);
    if (!userLoggedIn) {
        login();
    } else {

        ArrayList<HashMap<String, String>> newsFeed = getNewsJson();




        // Second to be printed:
        System.out.println("LIST DATA");



                    System.out.println(newsFeed);
        SimpleAdapter adapter = new SimpleAdapter(
                this,
                newsFeed,
                R.layout.assignment_list_row_view,
                new String[] { "photo", "dateAssigned", "dateDue",
                        "description" },
                new int[] { R.id.text1, R.id.text2, R.id.text3, R.id.text4 });
        setListAdapter(adapter);
    }
}

ArrayList<HashMap<String, String>> newsFeed = new ArrayList<HashMap<String, String>>();

private ArrayList<HashMap<String, String>> getNewsJson() {
    ApplicationGlobal g = (ApplicationGlobal) getApplication();
    AsyncHttpClient clientSession = new AsyncHttpClient();
    PersistentCookieStore cookieStore = g.getCookieStore();
    clientSession.setCookieStore(cookieStore);
    clientSession.get("http://192.168.1.42:5000/news/dummy/all/",
            new JsonHttpResponseHandler() {
                @Override
                public void onSuccess(JSONObject response) {
                    JSONArray assignments = new JSONArray();
                    try {
                        assignments = response.getJSONArray("assignments");
                        JSONObject c = assignments.getJSONObject(0);

                        for (int i = 0; i < assignments.length() + 1; i++) {

                            JSONObject individualAssignment = new JSONObject(
                                    c.getString(Integer.toString(i)));

                            HashMap<String, String> map = new HashMap<String, String>();
                            map.put("photo",
                                    individualAssignment.getString("photo"));
                            map.put("dateAssigned", individualAssignment
                                    .getString("date_assigned"));
                            map.put("dateDue", individualAssignment
                                    .getString("date_due"));
                            map.put("description", individualAssignment
                                    .getString("description"));

                            newsFeed.add(map);


                            // Last to be printed (and printed multiple times, as expected)

                            System.out.println("RAW DATA");
                            System.out.println(newsFeed);
                        }

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });




    // First to be printed:

    System.out.println("RETURNED DATA");
    System.out.println(newsFeed);
    return newsFeed;
}

上記の 3 つのコメントに示されているようにonSuccess()、データが null 以外の値でアダプターに渡されるのに十分な時間が経過していないことが原因だと思います。

このコード スニペットが適切に機能するように再設計するには、どうすればよいでしょうか?

4

1 に答える 1

1

このメソッドは、非同期処理がまだ実行されている間、newsFeed を即座に返します。アダプターの初期化を onSuccess フローに入れると、問題が解決する可能性があります。

バックグラウンドで実行されていることと、メイン (UI) スレッドで処理する必要があることをより明確に把握できるため、バックグラウンド操作に AsyncTask を使用することをお勧めします。

AsyncTask 情報: http://developer.android.com/reference/android/os/AsyncTask.html

于 2012-12-30T02:22:08.987 に答える