我有一个应该获得JSON响应的方法。 这是:
public HttpResponse getJson() {
HttpResponse response = null;
try {
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
request.setURI(new URI("https://mysite.com/android/showJson.php"));
response = client.execute(request);
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return response;
}
showJson.php
会返回此信息:["item 1","item 2"]
我遇到的问题是我无法在getJson
内拨打onCreate
,因为它引发了错误:android.os.NetworkOnMainThreadException
我注意到我的方法应该在一个单独的类中,以便在onCreate
内调用它,但我无法管理它。我真的要哭了,我无法理解asyncTask的语法!我知道我错过了一些小事,但我无法将其视为初学者。
以下是onCreate
方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_top_jokes);
getJson();
String[] myStringArray = {"a","b","c","a","b","c","a","b","c","a","b","c","a","b","c","a","b","c"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, myStringArray);
ListView listView = (ListView) findViewById(R.id.topJokesList);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// When clicked, show a toast with the TextView text
Toast.makeText(getApplicationContext(),
((TextView) view).getText(), Toast.LENGTH_SHORT).show();
}
});
}
我正在使用一些测试值填充数组并将它们传递给listView
,但现在我需要用getJson
项填充它。
答案 0 :(得分:1)
有很多关于如何使用asynctasks的例子,这里有一个:
基本上,您应该添加将扩展AsyncTask的新类,并将后台任务(在您的案例中为getJson();
)添加到doInBackground
。在您的onCreate中,您在AsyncTask实例上调用execute()。当AsyncTask完成时,它将执行onPostExecute,它将在UI线程上执行,这是您可以更新UI的地方。
在onCreate中,您可以使用空数组将列表适配器设置为listview。在onPostExecute中,您应该使用新值更新ListView。实际上,最好在doInBackground中解析你的json,然后返回它引用的ArrayList,它将在onPostExecute中用来更新ListView。
答案 1 :(得分:1)
您需要一个AsyncTask,您可以在doInBackground方法中执行请求
当您收到回复时,需要使用onPostExecute方法通知主线程(ui)。
private class JsonTaskTask extends AsyncTask<Void, Void, Void> {
private HttpResponse response;
protected Long doInBackground(Void... params) {
reponse = getJson();
return null;
}
protected void onPostExecute(Void params) {
//Show Your Listview
}
public HttpResponse getJson() {
HttpResponse response = null;
try {
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
request.setURI(new URI("https://mysite.com/android/showJson.php"));
response = client.execute(request);
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return response;
}
}
通过
调用AsyncTasknew JsonTaskTask().execute(void, void, void);
要通知UI并更新ListView,您可以使用侦听器界面。例如就像我在this回答中所示。