我的任务有问题。基本上,我在做两个异步任务,按顺序执行,运行应用程序时总是出错。我使用一个flaskpython服务器通过API检索数据。我有两组对象需要以JSON格式从服务器获取。在服务器上的JSON中,我将根元素命名为我需要的集合的名称(roles
和device_types
),这两个集合本身都包含一个对象数组。当我在我的客户机JAVA(Android应用程序)中获取数据时,我检查根元素是否是必需的元素,并将它们放在相应对象的Arraylist中。问题是第二个请求返回了一个错误(注意:我将AsyncTask.execute请求放在onCreate中,因为在加载活动时,我将把作为适配器检索的json添加到一个Listview中
当我记录.d我的json响应时,我注意到它是不完整的。从服务器打印时,它是完整的
D/roles json: [
{
"roles": [
{
"name": "Anti-Spam",
"slug": "anti-spam",
"color": "f44336",
"vm_role": false,
"id": 23
},
{
"name": "Backup",
"slug": "backup",
"color": "ffc107",
"vm_role": true,
"id": 13
},
{
"name": "Blade Center",
"slug": "blade-center",
"color": "2f6a31",
"vm_role": false,
"id": 26
},
{
"name": "Console Server - Mangement Server",
"slug": "console-server-mangement-server",
"color": "009688",
"vm_role": false,
"id": 1
},
{
"name": "Deflecteur",
"slug": "deflecteur",
"color": "00bcd4",
"vm_role": false,
"id": 42
},
{
"name": "Disk",
"slug": "disk",
"color": "aa1409",
"vm_role": false,
"id": 34
},
{
"name": "DS3524 Battery",
"slug": "ds3524-battery",
"color": "aa1409",
"vm_role": true,
"id": 37
},
{
"name": "DS3524 Controller",
"slug": "ds3524-controller",
"color": "ffeb3b",
"vm_role": true,
"id": 35
},
{
"name": "DS3524 PowerFAN",
"slug": "ds3524-powerfan",
"color": "aa1409",
"vm_role": true,
"id": 36
},
{
"name": "Equipements Tiers",
"slug": "equipements-tiers",
"color": "111111",
"vm_role": true,
"id": 28
},
{
"name": "Firewall Client",
"slug": "firewall-client",
"color": "f44336",
"vm_role": true,
"id": 33
},
{
"name": "Firewall OMT",
"slug": "firewall-omt",
"color": "f44336",
"vm_role": true,
"id": 6
},
{
"name": "Media Gateway",
"slug": "media-gateway",
"color": "cddc39",
"vm_role": true,
"id": 11
},
{
"name": "Mobile NSS - Data Gateway",
"slug": "mobile-nss-data-gateway",
"color": "3f51b5",
"vm_role": true,
"id": 47
},
{
"name": "Mobile NSS - DSR",
"slug": "mobile-nss-dsr",
"color": "3f51b5",
"vm_role": true,
"id": 49
},
{
"name": "Mobile NSS - Messaging",
"slug": "mobile-nss-messaging",
"color": "3f51b5",
"vm_role": true,
"id": 44
},
{
"name": "Mobile NSS - Mobility Management",
"slug": "mobile-nss-mobility-management",
"color": "3f51b5",
"vm_role": true,
"id": 45
},
{
"name": "Mobile NSS - OAM",
"slug": "mobile-nss-oam",
"color": "3f51b5",
"vm_role": true,
"id": 51
},
{
"name": "Mobile NSS - OTA",
"slug": "mobile-nss-ota",
"color": "3f51b5",
"vm_role": true,
"id": 43
},
{
"name": "Mobile NSS
运行Android Studio时出错
AsyncTask roles= new form.HTTPAsyncTask().execute("http://10.0.2.2:5000/get_role_id");
W/System.err: org.json.JSONException: End of input at character 0 of at org.json.JSONTokener.syntaxError(JSONTokener.java:449) at org.json.JSONTokener.nextValue(JSONTokener.java:97) at org.json.JSONArray.(JSONArray.java:92)
从python服务器打印的json
[{"roles": [{"name": "Anti-Spam", "slug": "anti-spam", "color": "f44336", "vm_role": false, "id": 23}, {"name": "Backup", "slug": "backup", "color": "ffc107", "vm_role": true, "id": 13}, {"name": "Blade Center", "slug": "blade-center", "color": "2f6a31", "vm_role": false, "id": 26}, {"name": "Console Server - Mangement Server", "slug": "console-server-mangement-server", "color": "009688", "vm_role": false, "id": 1}, {"name": "Deflecteur", "slug": "deflecteur",...
代码:
private String HttpPost(String myUrl) throws IOException, JSONException {
String result = "";
URL url = new URL(myUrl);
// 1. create HttpURLConnection
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json; charset=utf-8");
// 2. build JSON object
JSONObject jsonObject = buidJsonObject();
// 3. add JSON content to POST request body
setPostRequestContent(conn, jsonObject);
// 4. make POST request to the given URL
conn.connect();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"),8);
StringBuilder sb = new StringBuilder();
String output;
while ((output = br.readLine()) != null) {
sb.append(output);
}
return sb.toString();
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_form);
all=new ArrayList<DeviceType>();
listTypes=new ArrayList<DeviceType>();
listRoles=new ArrayList<Roles>();
if(checkNetworkConnection()){
AsyncTask dtypes= new form.HTTPAsyncTask().execute("http://10.0.2.2:5000/get_dtypes");
AsyncTask roles= new form.HTTPAsyncTask().execute("http://10.0.2.2:5000/get_role_id");
}
}
else{
Toast.makeText(this, "Not Connected!", Toast.LENGTH_SHORT).show();}
}
private class HTTPAsyncTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
// params comes from the execute() call: params[0] is the url.
try {
try {
return HttpPost(urls[0]);
} catch (JSONException e) {
e.printStackTrace();
return "Error!";
}
} catch (IOException e) {
return "Unabdgdsle to retrieve web page. URL may be invalid.";
}
}
protected void onPostExecute(String result) {
String N1=null;
JSONObject obj=null;
JSONArray temparr=null;
JSONArray temparr2=null;
JSONArray arr=null;
try {
arr = new JSONArray(result);
if(arr.getJSONObject(0).optString("device_types")!=null){
//System.out.println("types: "+arr.getJSONObject(0).optString("device_types"));
temparr=new JSONArray(arr.getJSONObject(0).optString("device_types"));
System.out.println("got device types");
for(int i=0; i < temparr.length(); i++) {
//obj = arr.getJSONObject(i);
String m=temparr.getJSONObject(i).getString("manufacturer");
int mid=temparr.getJSONObject(i).getInt("manufacturerid");
String mod=temparr.getJSONObject(i).getString("model");
String pn=temparr.getJSONObject(i).getString("part_number");
int id=temparr.getJSONObject(i).getInt("id");
listTypes.add(new DeviceType(m,mid,mod,pn,id));
//arrTypes[i]= arr.getJSONObject(i);
}
System.out.println(listTypes.toString());
System.out.println(listTypes.size());
}
if(arr.getJSONObject(0).optString("roles")!=null){
//System.out.println("roles: "+arr.getJSONObject(0).optString("roles"));
temparr2=new JSONArray(arr.getJSONObject(0).optString("roles"));
System.out.println("got roles");
for(int i=0; i < temparr2.length(); i++) {
//obj = arr.getJSONObject(i);
String c=temparr2.getJSONObject(i).getString("color");
int id=temparr2.getJSONObject(i).getInt("id");
String n=temparr2.getJSONObject(i).getString("name");
String s=temparr2.getJSONObject(i).getString("slug");
listRoles.add(new Roles(c,id,n,s));
//arrTypes[i]= arr.getJSONObject(i);
}
System.out.println(listRoles.toString());
System.out.println(listRoles.size());
}
} catch (JSONException e) {
e.printStackTrace();
}
private JSONObject buidJsonObject() throws JSONException {
JSONObject jsonObject = new JSONObject();
jsonObject.accumulate("token", "1");
return jsonObject;
}
private void setPostRequestContent(HttpURLConnection conn,
JSONObject jsonObject) throws IOException {
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
writer.write(jsonObject.toString());
Log.i(login.class.toString(), jsonObject.toString());
writer.flush();
writer.close();
os.close();
}
你可能会得到一个空白的回答。它不为null,但响应为空。所以你得到的是这个错误,而不是一个NPE异常
编辑: 我看到您正在使用一个名为
HttpPost
的方法,并且假设它在URL上使用方法“POST”,您应该使用“GET”而不是“POST”相关问题 更多 >
编程相关推荐