使用来自 JSON(由后台线程填充)Android 的数组数据填充列表视图



我正在尝试创建一个窗口,该窗口将显示一个列表框,其中填充了从 JSON 解析的数组。

列表视图在我的MainActivityOnCreate方法中填充和创建。在主活动中,我还调用了一个AsyncTask来解析来自网站的 JSON 数组。

任务如下所示:

    public class JSONParse extends AsyncTask<String, String, String[]> {
@Override
protected String[] doInBackground(String... params) {
    HttpURLConnection connection = null;
    BufferedReader reader = null;
    try {
        URL url = new URL(params[0]);
        connection = (HttpURLConnection) url.openConnection();
        connection.connect();
        InputStream IStream = connection.getInputStream();
        reader = new BufferedReader(new InputStreamReader(IStream));
        StringBuffer buffer = new StringBuffer();
        String recievedLine = "";
        while ((recievedLine = reader.readLine()) != null) {
            buffer.append(recievedLine);
        }
        String full = buffer.toString();

        JSONObject JSONParent = new JSONObject(full);
        JSONArray j_Puzzles = JSONParent.getJSONArray("PuzzleIndex");
        int arraySize = j_Puzzles.length();
        String[] s_Puzzles = new String[arraySize];
        StringBuffer endString = new StringBuffer();
        for (int i = 0; i < j_Puzzles.length(); i++) {
            s_Puzzles[i] = j_Puzzles.toString(i);
            endString.append(s_Puzzles[i] + "n");
        }
        MainActivity.Waiting = true;
        return s_Puzzles;
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    } finally {
        if (connection != null) {
            connection.disconnect();
        }
        try {
            if (reader != null) {
                reader.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
}

s_Puzzles从后台线程中取出并进入我的OnCreate的最佳方法是什么,以便可以像这样使用它:

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    new JSONParse().execute("http://www.hull.ac.uk/php/349628/08309/acw/index.json");

    ListView listView = (ListView) findViewById(R.id.listView);
    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, android.R.id.text1, s_Puzzles);
    listView.setAdapter(arrayAdapter);
}
}

此外,我是否必须暂停OnCreate方法,直到后台工作线程完成,以防止由于工作线程未完成而导致列表视图更新。

任何帮助表示赞赏。谢谢

您正在尝试调用 AsyncTask,然后在不确定信息是否已加载时设置信息。请记住,它是异步加载的。我建议您在 AsyncTask 的 onPostExecute() 方法上执行此操作。AsyncTask 有 4 种方法可以自定义:

  1. doInProgress:从线程发送到UI线程(活动)进度,通常是一个数字。您可以在此处更新 UI。
  2. onPreExecute:在线程开始运行之前设置内容。您可以在此处更新 UI。
  3. doInBackground:你已经有了它,它很完美。在这里,您无法更新 UI,因为此 UI 在后台线程上运行。这是 AsyncTask 中唯一不在 UI 线程(活动)上运行的方法。
  4. onPostExecute:你从doInBackground获得结果。这是您应该更新 UI 的位置。

您可以找到任何AsyncTask及其简单的教程。在这个项目中,我使用AsyncTask进行相同的操作。https://github.com/isaacurbina/ViewHolderListView/tree/master/app/src/main/java/com/mac/isaac/viewholderlistview

希望对您有所帮助!

这样的事情会起作用,而不需要过度复杂化你已经拥有的东西:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final ListView listView = (ListView) findViewById(R.id.listView);
    final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, android.R.id.text1, new ArrayList<String>());
    listView.setAdapter(arrayAdapter);
    new JSONParse() {
        @Override
        protected void onPostExecute(String[] puzzles)
        {
            super.onPostExecute(puzzles);
            arrayAdapter.addAll(puzzles);
        }
    }.execute("http://www.hull.ac.uk/php/349628/08309/acw/index.json");
}

最新更新