Php 在新AsyncTask中输出来自上一个AsyncTask的JSON响应
我目前正在尝试为学生财务应用程序创建一个设置页面,每当用户打开设置页面时,他们的设置都会使用在线托管的php脚本从数据库加载 这很好,但是当我执行另一个异步任务时,当他们单击将设置保存到数据库时,我得到的JSON响应与第一个异步任务相同 每个任务调用一个不同的PHP脚本,因此它们之间没有干扰问题(我相信),但我不知道为什么我的PHP代码没有得到正确的响应 包含异步任务的Java文件:Php 在新AsyncTask中输出来自上一个AsyncTask的JSON响应,php,android,json,mysqli,android-asynctask,Php,Android,Json,Mysqli,Android Asynctask,我目前正在尝试为学生财务应用程序创建一个设置页面,每当用户打开设置页面时,他们的设置都会使用在线托管的php脚本从数据库加载 这很好,但是当我执行另一个异步任务时,当他们单击将设置保存到数据库时,我得到的JSON响应与第一个异步任务相同 每个任务调用一个不同的PHP脚本,因此它们之间没有干扰问题(我相信),但我不知道为什么我的PHP代码没有得到正确的响应 包含异步任务的Java文件: package com.samjackson.scholardollars; import android.a
package com.samjackson.scholardollars;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class SettingsActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
JSONParser jsonParser = new JSONParser();
private static final String SETTINGS_URL = "http://appinterface-scholardollars.c9.io/getusersettings.php";
private static final String UPDATE_SETTINGS_URL = "http://appinterface-scholardollars.c9.io/updateusersettings.php";
private static final String TAG_SUCCESS = "success";
private static final String TAG_MESSAGE = "message";
private static final String TAG_BUDGET = "Budget";
private static final String TAG_FREQUENCY = "Frequency";
private static final String TAG_DISPLAY_NAME = "DisplayName";
ProgressDialog pDialog;
static int Budget;
static String BudgetFrequency;
static String DisplayName;
static String postDisplayName, postBudgetFrequency, postBudget;
EditTextPreference displayName, budget;
ListPreference frequency;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
SharedPreferences sp = getPreferenceScreen().getSharedPreferences();
sp.registerOnSharedPreferenceChangeListener(this);
displayName = (EditTextPreference)findPreference("displayName_preference");
frequency = (ListPreference)findPreference("frequency_preference");
budget = (EditTextPreference)findPreference("budgetAmount_preference");
getUserSettings();
}
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Preference pref = findPreference(key);
if(key.equals("displayName_preference")){
EditTextPreference displayPersonName = (EditTextPreference) pref;
pref.setSummary(displayPersonName.getText());
postDisplayName = displayPersonName.getText();
}else if(key.equals("frequency_preference"))
{
ListPreference lp = (ListPreference) pref;
pref.setSummary(lp.getEntry());
postBudgetFrequency = lp.getEntry().toString();
}else if(key.equals("budgetAmount_preference")){
EditTextPreference etp = (EditTextPreference) pref;
pref.setSummary(etp.getText());
postBudget = etp.getText();
}
}
private void updateSettings(){
System.out.println("updating settings");
class AttemptSettingsUpdate extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute(){
super.onPreExecute();
pDialog = new ProgressDialog(SettingsActivity.this);
pDialog.setMessage("Updating settings...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
@Override
protected String doInBackground(String... args){
System.out.println("starting background task");
int success;
System.out.println("ID = "+ Integer.toString(LoginActivity.getUID())+" - Budget = "+postBudget+" - Frequency: " + postBudgetFrequency + " - Display Name: "+postDisplayName);
try{
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("budget", postBudget));
params.add(new BasicNameValuePair("frequency", postBudgetFrequency));
params.add(new BasicNameValuePair("display name", postDisplayName));
params.add(new BasicNameValuePair("ID", Integer.toString(LoginActivity.getUID())));
Log.d("Request!", "Starting at url: " + UPDATE_SETTINGS_URL);
JSONObject jsonNewSettings = jsonParser.makeHttpRequest(UPDATE_SETTINGS_URL, "POST", params);
System.out.println(jsonNewSettings);
success = jsonNewSettings.getInt(TAG_SUCCESS);
if(success==1){
Log.d("Changed settings!", jsonNewSettings.toString());
Intent intent = new Intent(SettingsActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
}else{
return jsonNewSettings.getString(TAG_MESSAGE);
}
}catch(JSONException e){
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String message){
pDialog.dismiss();
if(message != null){
Toast.makeText(SettingsActivity.this, message, Toast.LENGTH_LONG).show();
}
}
}
new AttemptSettingsUpdate().execute();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_settings, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}else if(id == R.id.action_save){
updateSettings();
return true;
}
return super.onOptionsItemSelected(item);
}
/*public static class Prefs1Fragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
}
}*/
public void getUserSettings(){
class AttemptSettings extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute(){
super.onPreExecute();
pDialog = new ProgressDialog(SettingsActivity.this);
pDialog.setMessage("Loading settings from database...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
@Override
protected String doInBackground(String... args){
System.out.println("doing background task (settings)");
int success;
int UID = LoginActivity.getUID();
System.out.println("UID >>>> "+UID);
try{
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("ID", Integer.toString(UID)));
Log.d("Request!", "Starting");
JSONObject json = jsonParser.makeHttpRequest(
SETTINGS_URL, "POST", params);
success = json.getInt(TAG_SUCCESS);
if(success==1){
Log.d("Successfully accessed user settings!", json.toString());
Budget = json.getInt(TAG_BUDGET);
BudgetFrequency = json.getString(TAG_FREQUENCY);
DisplayName = json.getString(TAG_DISPLAY_NAME);
System.out.println("Budget: " + Budget + " - Budget Frequency: " + BudgetFrequency + " - Display Name: " + DisplayName);
return json.getString(TAG_MESSAGE);
}else{
return json.getString(TAG_MESSAGE);
}
}catch(JSONException e){
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String message){
pDialog.dismiss();
displayName.setSummary(DisplayName);
frequency.setSummary(BudgetFrequency);
budget.setSummary(Integer.toString(Budget));
if(message != null){
Toast.makeText(SettingsActivity.this, message, Toast.LENGTH_LONG).show();
}
}
}
new AttemptSettings().execute();
}
}
package com.samjackson.scholardollars;
导入android.app.ProgressDialog;
导入android.content.Intent;
导入android.content.SharedReferences;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.preference.EditTextPreference;
导入android.preference.ListPreference;
导入android.preference.preference;
导入android.preference.PreferenceActivity;
导入android.util.Log;
导入android.view.Menu;
导入android.view.MenuItem;
导入android.widget.Toast;
导入org.apache.http.NameValuePair;
导入org.apache.http.message.BasicNameValuePair;
导入org.json.JSONException;
导入org.json.JSONObject;
导入java.util.ArrayList;
导入java.util.List;
公共类设置活动扩展首选项活动实现SharedReferences.OnSharedPreferenceChangeListener{
JSONParser JSONParser=新的JSONParser();
私有静态最终字符串设置\u URL=”http://appinterface-scholardollars.c9.io/getusersettings.php";
私有静态最终字符串更新\u设置\u URL=”http://appinterface-scholardollars.c9.io/updateusersettings.php";
私有静态最终字符串标记_SUCCESS=“SUCCESS”;
私有静态最终字符串标记_MESSAGE=“MESSAGE”;
私有静态最终字符串标记_BUDGET=“BUDGET”;
专用静态最终字符串标记\u FREQUENCY=“FREQUENCY”;
私有静态最终字符串标记\u DISPLAY\u NAME=“DisplayName”;
ProgressDialog;
静态内部预算;
静态字符串BudgetFrequency;
静态字符串显示名;
静态字符串postDisplayName、postBudgetFrequency、postBudget;
EditTextPreference显示名称、预算;
列表偏好频率;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
SharedReferences sp=getPreferenceScreen().GetSharedReferences();
sp.registerOnSharedReferenceChangeListener(此);
displayName=(EditTextPreference)FindReference(“displayName_首选项”);
频率=(列表首选项)查找首选项(“频率首选项”);
预算=(EditTextPreference)FindReference(“budgetAmount_preference”);
getUserSettings();
}
已更改共享首选项上的公共void(SharedReferences SharedReferences,字符串键){
首选项pref=findPreference(键);
if(key.equals(“displayName_首选项”)){
EditTextPreference displayPersonName=(EditTextPreference)pref;
pref.setSummary(displayPersonName.getText());
postDisplayName=displayPersonName.getText();
}else if(键等于(“频率偏好”))
{
ListPreference lp=(ListPreference)pref;
pref.setSummary(lp.getEntry());
postBudgetFrequency=lp.getEntry().toString();
}else if(键等于(“预算数量优先”)){
EditTextPreference etp=(EditTextPreference)pref;
pref.setSummary(etp.getText());
postBudget=etp.getText();
}
}
私有void更新设置(){
System.out.println(“更新设置”);
类AttemptSettingsUpdate扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
pDialog=新建进度对话框(setingsactivity.this);
setMessage(“更新设置…”);
pDialog.setUndeterminate(假);
pDialog.setCancelable(真);
pDialog.show();
}
@凌驾
受保护的字符串doInBackground(字符串…args){
System.out.println(“启动后台任务”);
成功;
System.out.println(“ID=“+Integer.toString(LoginActivity.getUID())+”-Budget=“+postBudget+”-频率:“+postBudgetFrequency+”-显示名称:“+postDisplayName”);
试一试{
List params=new ArrayList();
参数添加(新的BasicNameValuePair(“预算”,后预算));
参数添加(新的BasicNameValuePair(“频率”,postBudgetFrequency));
添加(新的BasicNameValuePair(“显示名称”,postDisplayName));
add(新的BasicNameValuePair(“ID”,Integer.toString(LoginActivity.getUID()));
Log.d(“请求!”,从url开始:“+UPDATE\u SETTINGS\u url”);
JSONObject jsonNewSettings=jsonParser.makeHttpRequest(更新设置URL,“POST”,参数);
系统输出打印LN(jsonNewSettings);
success=jsonNewSettings.getInt(TAG_success);
如果(成功==1){
Log.d(“更改的设置!”,jsonNewSettings.toString());
意向意向=新意向(SettingsActivity.this、MainActivity.class);
intent.addFlags(intent.FLAG\u ACTIVITY\u CLEAR\u TOP);
星触觉(意向);
完成();
}否则{
返回jsonNewSettings.getString(TAG_消息);
}
}捕获(JSONException e){
e、 printStackTrace();
}
返回null;
package com.samjackson.scholardollars;
import android.util.Log;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;
public class JSONParser {
static InputStream is = null;
static JSONObject jsonObj ;
static String json = "";
// default no argument constructor for jsonpaser class
public JSONParser() {
}
public JSONObject getJSONFromUrl(final String url) {
// Making HTTP request
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
// Executing POST request & storing the response from server locally.
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
// Create a BufferedReader
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
// Declaring string builder
StringBuilder str = new StringBuilder();
// string to store the JSON object.
String strLine = null;
// Building while we have string !equal null.
while ((strLine = reader.readLine()) != null) {
str.append(strLine + "\n");
}
// Close inputstream.
is.close();
// string builder data conversion to string.
json = str.toString();
} catch (Exception e) {
Log.e("Error", " something wrong with converting result " + e.toString());
}
// Try block used for pasrseing String to a json object
try {
jsonObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("json Parsering", "" + e.toString());
}
// Returning json Object.
return jsonObj;
}
public JSONObject makeHttpRequest(String url, String method,
List<NameValuePair> params) {
// Make HTTP request
try {
// checking request method
if(method == "POST"){
// now defaultHttpClient object
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(params));
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}else if(method == "GET"){
// request method is GET
DefaultHttpClient httpClient = new DefaultHttpClient();
String paramString = URLEncodedUtils.format(params, "utf-8");
url += "?" + paramString;
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder str = new StringBuilder();
String strLine = null;
while ((strLine = reader.readLine()) != null) {
str.append(strLine + "\n");
}
is.close();
json = str.toString();
} catch (Exception e) {
}
// now will try to parse the string into JSON object
try {
jsonObj = new JSONObject(json);
} catch (JSONException e) {
}
return jsonObj;
}
}
<?php
$servername = "xxxxx";
$username = "xxxxx";
$password = "xxxxxx";
$dbname = "users";
$id = $_POST['ID'];
settype($id, "Integer");
$budget = $_POST['budget'];
settype($budget, "Integer");
$frequency = $_POST['frequency'];
$displayName = $_POST['display name'];
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
$response["success"] = 0;
$response["message"] = "Connection error";
die(json_encode($response));
}
if(!empty($_POST)){
$sql = "UPDATE `UserSettings` SET `Budget`='$budget',`BudgetFrequency`='$frequency',`DisplayName`='$displayName' WHERE `ID` = '$id'";
$result = $conn->query($sql);
$testResult = "SELECT `ID`, `Budget`, `BudgetFrequency`, `DisplayName` FROM `UserSettings` WHERE `ID` = '$id'";
$result2 = $conn->query($testResult);
if($result2->num_rows > 0){
while($row = $result2->fetch_assoc()){
if($row["Budget"] = $budget AND $row["BudgetFrequency"] = $frequency AND $row["DisplayName"] = $displayName){
$response["success"] = 1;
$response["message"] = "Settings updated!";
die(json_encode($response));
}else{
$response["success"] = 0;
$response["message"] = "Settings do not match after update";
die(json_encode($response));
}
}
}else{
$response["success"] = 0;
$response["message"] = "Second query returned no results";
die(json_encode($response));
}
}else{
$response["success"] = 0;
$response["message"] = "No data provided";
die(json_encode($response));
}
?>
<?php
$servername = "xxxxx";
$username = "xxxxx";
$password = "xxxxx";
$dbname = "users";
$id = $_POST['ID'];
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
if(!empty($_POST)){
settype($id, "Integer");
$sql = "SELECT `Budget`, `BudgetFrequency`, `DisplayName` FROM `UserSettings` WHERE `ID` = '$id'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
$response["message"] = "Budget " . $row["Budget"]. " - Frequency " . $row["BudgetFrequency"]. " - Display Name: " . $row["DisplayName"];
$response["Budget"] = $row["Budget"];
$response["Frequency"] = $row["BudgetFrequency"];
$response["DisplayName"] = $row["DisplayName"];
$response["success"] = 1;
die(json_encode($response));
}
} else {
$response["message"] = "Returned no results";
$response["success"] = 0;
die(json_encode($response));
}
}else{
$response["message"] = "No ID provided, error in yer code sam - check that ID is referenced from LoginActivity properly.";
$response["success"] = 0;
die(json_encode($response));
}
?>