我尝试从外部服务器上的mysql数据库中获取单个数据行。到现在为止它工作得很好。现在我尝试从服务器获取JSONArray以在ListView中显示它。我试着解释我遇到的问题。
备注:我删除了真正的网址,经过测试,网址和php脚本都正常工作。如果我在浏览器中键入url,脚本将以JSON格式提供所请求的数据。
这部分代码:
/**
* Background Async Task to Load all product by making HTTP Request
*/
class LoadAllProducts extends AsyncTask<String, String, String> {
ProgressDialog pdLoading = new ProgressDialog(AllProductsActivity.this);
HttpURLConnection conn;
URL url = null;
@Override
protected void onPreExecute() {
super.onPreExecute();
//this method will be running on UI thread
pdLoading.setMessage("\tLoading...");
pdLoading.setCancelable(false);
pdLoading.show();
}
@Override
protected String doInBackground(String... params) { //type must be a problem
try {
url = new URL("http://somewhere");
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "exception";
}
try {
// Setup HttpURLConnection class to send and receive data from php and mysql
conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(READ_TIMEOUT);
conn.setConnectTimeout(CONNECTION_TIMEOUT);
conn.setRequestMethod("POST");
// setDoInput and setDoOutput method depict handling of both send and receive
conn.setDoInput(true);
conn.setDoOutput(true);
// Post Parameter an URL anhängen
Uri.Builder builder = new Uri.Builder()
.appendQueryParameter("loge", params[0]);
String query = builder.build().getEncodedQuery();
// Open connection for sending data
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(os, "UTF-8"));
writer.write(query);
writer.flush();
writer.close();
os.close();
conn.connect();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
return "exception";
}
try {
int response_code = conn.getResponseCode();
// Check if successful connection made
if (response_code == HttpURLConnection.HTTP_OK) {
// Read data sent from server
InputStream input = conn.getInputStream();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
StringBuilder result = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
result.append(line);
}
JSONObject jsonObject = new JSONObject(result.toString());
// Pass data to onPostExecute method
return jsonObject.toString(); //this might be a problem
// return (result.toString());
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
//if something went wrong, return null
return null;
} else {
return ("unsuccessful");
}
} catch (IOException e) {
e.printStackTrace();
return "exception";
} finally {
conn.disconnect();
}
}
protected void onPostExecute(String result) {
//no idea how to get ths JSONObject in the parameterlist and convert it to ArrayList
ArrayList<String> listdata = new ArrayList<String>();
String jArray = (String) result;
if (jArray != null) {
for (int i=0;i<jArray.length();i++){
listdata.add(jArray(i));
}
}
第一个问题哪个类型是doInBackground
函数的选择,我的返回也应该是这样的错误?
第二,如何将jsonObject传递给我的函数onPostExecute
?在这个位置使用哪种类型?
最后一个,如何将jsonObject变量的内容提供给我的ArrayList?
此外:是的,我阅读了很多其他帖子和一些教程,但我无法将我得到的信息转移到我的例子中。
EDIT1:字符串的一部分,来自服务器:
[{&#34; NR&#34;:&#34; 317&#34;&#34;基准&#34;:&#34; 2016年2月9日&#34;&#34;宰特& #34;:&#34; 19:30:00&#34;&#34; THEMA&#34;:&#34;&#34;&#34; kopfnr&#34;:&#34; 2&# 34;,&#34;典型值&#34;:&#34; 2&#34;},{&#34; NR&#34;:&#34; 318&#34;&#34;基准&#34 ;: &#34; 2016年2月23日&#34;&#34;宰特&#34;:&#34; 20:00:00&#34;&#34; THEMA&#34;:&#34; Wandern&# 34;,&#34; kopfnr&#34;:&#34; 2&#34;&#34;典型值&#34;:&#34; 6&#34;},{&#34; NR&#34 ;: #&34; 319&#34;&#34;基准&#34;:&#34; 2016年3月1日和#34;&#34;宰特&#34;:&#34; 18:45:00&# 34;,&#34; THEMA&#34;:&#34; Instruktion&#34;&#34; kopfnr&#34;:&#34; 2&#34;&#34;典型值&#34;:&# 34; 7&#34;},{&#34; NR&#34;:&#34; 320&#34;&#34;基准&#34;:&#34; 2016年3月1日和#34;,& #34; zeit&#34;:&#34; 20:00:00&#34;,&#34; thema&#34;:&#34; Eine Schwester stellt sich vor&#34;,&#34; kopfnr&#34 ;:&#34; 2&#34;&#34;典型值&#34;:&#34; 7&#34;},{&#34; NR&#34;:&#34; 321&#34;,& #34;基准&#34;:&#34; 2016年3月8日&#34;&#34;宰特&#34;:&#34; 19:30:00&#34;&#34; THEMA&#34 ;:&#34; Der Spiegel&#34;,&#34; kopfnr&#34;:&#34; 2&#34;,&#34; typ&#34;:&#34; 5&#34;},{ &#34; NR&#34;:&#34; 322&#34; &#34;基准&#34;:&#34; 2016年3月22日&#34;&#34;宰特&#34;:&#34; 20:00:00&#34;&#34; THEMA& #34;:空,&#34; kopfnr&#34;:&#34; 2&#34;&#34;典型值&#34;:&#34; 6&#34;}]
EDIT2:我按照解释错误消失了!我明白它是如何工作的。谢谢
我还剩下一个问题,如何从protected void onPostExecute( ArrayList<String> result)
获取arraylist
我之前调用的asyncTask函数是:new LoadAllProducts().execute(loge);
但是我可能会{= 1}}在函数中使用returnvalue进行更改,因为它在asyncTask进程中自动调用,对吧?
在那之后一切都结束了我保证
答案 0 :(得分:1)
第一个问题是哪种类型是doInBackground的选择 功能
帖子中的JSON字符串是JSONArray
的{{1}}而不是JSONObject's
。从JSONObject
中的JSONArray
创建result
:
doInBackground
如何将jsonObject传递给我的函数onPostExecute?
而不是JSONArray jsonArray = new JSONArray(result.toString());
返回JSONObject
项。
如何将jsonObject变量的内容提供给我的ArrayList?
解析ArrayList
以从中获取所有JSONObject,然后从每个jsonArray
获取所需值并将其添加到JSONObject
listdata