【发布时间】:2017-03-22 05:04:25
【问题描述】:
我正在开发一个 Android Studio 应用程序,需要使用 php 从外部 SQL 数据库中的表中提取信息并将其显示在 ListView 中。代码没有显示任何错误,但 ListView 运行时屏幕上什么也没有显示。
这就是我所引用的:http://www.androidhive.info/2012/01/android-json-parsing-tutorial/
HomePage.Java(这是应用程序的主屏幕,这是 ListView 所在的屏幕)
package com.example.marlo.myapplication;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.HashMap;
public class HomePage extends AppCompatActivity {
// the variables with the et in front are for registration
// the others are for signing in
private String TAG = MainActivity.class.getSimpleName();
private ListView lv;
ArrayList<HashMap<String, String>> databaseList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageButton facilitiesHome = (ImageButton) findViewById(R.id.facilitiesIcon);
final ImageButton activity_activities = (ImageButton) findViewById(R.id.activitiesIcon);
final ImageButton trackersIcon = (ImageButton) findViewById(R.id.trackersIcon);
final Button newEntry = (Button) findViewById(R.id.bNewEntry);
final ListView lv = (ListView) findViewById(R.id.databaseItems);
databaseList = new ArrayList<>();
// bottom bar, facilities home page
facilitiesHome.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent createFacilitiesHomeIntent = new Intent(HomePage.this, FacilitiesHome.class);
HomePage.this.startActivity(createFacilitiesHomeIntent);
}
});
//bottom bar, activities home page
activity_activities.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent createActivitiesIconIntent = new Intent(HomePage.this, ActivitiesHome.class);
HomePage.this.startActivity(createActivitiesIconIntent);
}
//
});
//bottom bar, trackers home page
trackersIcon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent createTrackerIconIntent = new Intent(HomePage.this, TrackerHome.class);
HomePage.this.startActivity(createTrackerIconIntent);
}
//
});
//New Entry short cut
newEntry.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent createNewEntryIntent = new Intent(HomePage.this, NewEntry.class);
HomePage.this.startActivity(createNewEntryIntent);
}
//
});
//new HomePageActivity(this).execute();
}
private class HomePageActivity extends AsyncTask<Array, Void, Array> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Array doInBackground(Array... arg0) {
String link;
//String data;
//BufferedReader bufferedReader;
Array result;
//try {
link = "http://cgi.soic.indiana.edu/~team19/home_page_no_mood.php";
//URL url = new URL(link);
HttpHandler sh = new HttpHandler();
String jsonStr = sh.makeServiceCall(link);
Log.e(TAG, "Response from database: " + jsonStr);
//Array jsonArray = result;
if (jsonStr != null) {
try {
JSONObject jsonObj = new JSONObject(jsonStr);
// Getting JSON Array node
JSONArray userdata = jsonObj.getJSONArray("userdata");
// looping through All Userdata
for (int i = 0; i < userdata.length(); i++) {
JSONObject c = userdata.getJSONObject(i);
String username = c.getString("username");
String email = c.getString("email");
String age = c.getString("age");
String sex = c.getString("sex");
String hobbies = c.getString("hobbies");
String interests = c.getString("interests");
// tmp hash map for single contact
HashMap<String, String> contact = new HashMap<>();
// adding each child node to HashMap key => value
contact.put("username", username);
contact.put("email", email);
contact.put("age", age);
contact.put("sex", sex);
contact.put("hobbies", hobbies);
contact.put("interests", interests);
// adding contact to contact list
databaseList.add(contact);
}
} catch (final JSONException e) {
Log.e(TAG, "Json parsing error: " + e.getMessage());
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),
"Json parsing error: " + e.getMessage(),
Toast.LENGTH_LONG)
.show();
}
});
}
} else {
Log.e(TAG, "Couldn't get json from server.");
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),
"Couldn't get json from server. Check LogCat for possible errors!",
Toast.LENGTH_LONG)
.show();
}
});
}
return null;
}
@Override
protected void onPostExecute(Array result) {
super.onPostExecute(result);
// Dismiss the progress dialog
/**
* Updating parsed JSON data into ListView
* */
ListAdapter adapter = new SimpleAdapter(
HomePage.this, databaseList,
R.layout.list_item, new String[]{"username", "email",
"age"}, new int[]{R.id.username,
R.id.email, R.id.age});
lv.setAdapter(adapter);
}
}
list_item.xml(这是列表项在 ListView 中的分解方式)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="@dimen/activity_horizontal_margin">
<TextView
android:id="@+id/username"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingBottom="2dip"
android:paddingTop="6dip"
android:textColor="@color/colorPrimaryDark"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/email"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingBottom="2dip"
android:textColor="@color/colorAccent" />
<TextView
android:id="@+id/age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#5d5d5d"
android:textStyle="bold" />
</LinearLayout>
activity_main.xml(这是应该填充 ListView 的 xml 文件)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_height="match_parent">
<include layout="@layout/app_bar"
/>
<android.support.v7.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:theme="?attr/actionBarTheme"
android:minHeight="?attr/actionBarSize"
android:id="@+id/bottomMenu"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_facilities"
android:id="@+id/facilitiesIcon"
android:background="@null"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_alignTop="@+id/bottomMenu"
android:onClick="facilitiesHome" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_trackers"
android:layout_marginLeft="34dp"
android:layout_marginStart="34dp"
android:id="@+id/trackersIcon"
android:background="@null"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignTop="@+id/bottomMenu"
android:onClick="trackersHome" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_activities"
android:layout_marginRight="34dp"
android:layout_marginEnd="34dp"
android:id="@+id/activitiesIcon"
android:background="@null"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignTop="@+id/bottomMenu"
android:onClick="activitiesHome" />
<Button
android:text="NEW ENTRY"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/bNewEntry"
android:backgroundTint="#69f0ae"
android:onClick="newEntry"
android:layout_above="@+id/bottomMenu"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<Button
android:text="recommended activities"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button2"
android:layout_above="@+id/bNewEntry"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<ListView
android:id="@+id/databaseItems"
android:inputType="textNoSuggestions"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/button2"
android:layout_centerHorizontal="true" />
</RelativeLayout>
HttpHandler.java(这是Http Handler Class,大部分是从上面列出的源代码中复制过来的)
package com.example.marlo.myapplication;
import android.util.Log;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
/**
* Created by MARLO on 3/21/17.
*/
public class HttpHandler {
private static final String TAG = HttpHandler.class.getSimpleName();
public HttpHandler() {
}
public String makeServiceCall(String reqUrl) {
String response = null;
try {
URL url = new URL(reqUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
// read the response
InputStream in = new BufferedInputStream(conn.getInputStream());
response = convertStreamToString(in);
} catch (MalformedURLException e) {
Log.e(TAG, "MalformedURLException: " + e.getMessage());
} catch (ProtocolException e) {
Log.e(TAG, "ProtocolException: " + e.getMessage());
} catch (IOException e) {
Log.e(TAG, "IOException: " + e.getMessage());
} catch (Exception e) {
Log.e(TAG, "Exception: " + e.getMessage());
}
return response;
}
private String convertStreamToString(InputStream is) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line;
try {
while ((line = reader.readLine()) != null) {
sb.append(line).append('\n');
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
}
home_page_no_mood.php(这是连接数据库的php文件)
<?php
$con = mysqli_connect("db.soic.indiana.edu", "caps16_team19", "capstoneteam19", "caps16_team19");
if (mysqli_connect_errno($con))
{
echo '{"query_result":"ERROR"}';
}
$accountid = $_GET["acid"]
$statement = mysqli_query($con, "SELECT a.username, a.email, a.dob, a.sex, a.hobbies, a.interests FROM account AS a WHERE a.acid = (SELECT max(a.acid))");
$rows = '{"userdata": "["}';
if($statement->num_rows > 0) {
while($row = mysqli_fetch_array($statement))
{
$rows = $row;
}
} else {
echo '{"query_result":"FAILURE"}';
}
$rows = '{"]"}';
echo json_encode($rows);
?>
谢谢你
8:16 使用可模拟链接 logcat 运行:
03-22 08:16:20.226 3277-3277/?我/艺术:不延迟启用 -Xcheck:jni (已经开启)03-22 08:16:20.226 3277-3277/? W/art:意外的 CPU 使用默认值的 X86 变体:x86 03-22 08:16:20.245 3277-3284/? 我/艺术:调试器不再活动 03-22 08:16:20.245 3277-3284/? 我/艺术:启动阻塞 GC 仪器 03-22 08:16:20.344 3277-3277/? W / System:ClassLoader引用了未知路径: /data/app/com.example.marlo.myapplication-2/lib/x86 03-22 08:16:20.349 3277-3277/? I/InstantRun:启动 Instant Run 服务器 com.example.marlo.myapplication 03-22 08:16:20.896 3277-3305/? I/OpenGLRenderer:初始化 EGL,版本 1.4 03-22 08:16:20.896 3277-3305/? D/OpenGLRenderer:交换行为 1 03-22 08:16:20.897 3277-3305/? W/OpenGLRenderer:无法选择配置 EGL_SWAP_BEHAVIOR_PRESERVED,重试不... 03-22 08:16:20.897 3277-3305/? D/OpenGLRenderer:交换行为 0 03-22 08:16:28.309 3277-3277/com.example.marlo.myapplication W/IInputConnectionWrapper: 非活动 InputConnection 上的 finishComposingText 03-22 08:16:36.409 3277-3277/com.example.marlo.myapplication W/IInputConnectionWrapper: 非活动 InputConnection 上的 finishComposingText
【问题讨论】:
-
先检查此链接上方的任何数据?
-
您可以通过转到 mockable.io 并为您的请求设置模拟响应来为该 Web 服务 api 创建模拟,只需创建一个帐户,使用 json 响应设置 url 运行它,然后您可以粘贴网址并将其替换为“cgi.soic.indiana.edu/~team19/home_page_no_mood.php”
-
demo0785838.mockable.io/cgi.soic.indiana.edu/~team19/… 我们尝试用这个可模拟的链接替换 php 链接,但没有显示错误。在上面添加 logcat。
标签: android listview arraylist adapter