我正在尝试创建一个窗口,该窗口将显示一个列表框,其中填充了从 JSON 解析的数组。
列表视图在我的MainActivity
的OnCreate
方法中填充和创建。在主活动中,我还调用了一个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 种方法可以自定义:
- doInProgress:从线程发送到UI线程(活动)进度,通常是一个数字。您可以在此处更新 UI。
- onPreExecute:在线程开始运行之前设置内容。您可以在此处更新 UI。
- doInBackground:你已经有了它,它很完美。在这里,您无法更新 UI,因为此 UI 在后台线程上运行。这是 AsyncTask 中唯一不在 UI 线程(活动)上运行的方法。
- 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");
}