В настоящее время я пытаюсь создать страницу настроек для приложения «Финансирование студентов», и каждый раз, когда пользователь открывает страницу настроек, его настройки загружаются из базы данных с использованием php-скрипта, размещенного в Интернете.
Это работает нормально, но когда я выполняю другую задачу Async, когда они нажимают, чтобы сохранить свои настройки в базе данных, я получаю тот же ответ JSON, что и мой первый AsyncTask.
Каждая задача вызывает свой скрипт PHP, так что это не проблема с помехами между ними (я полагаю), но я не знаю, почему я не получаю правильный ответ из своего кода PHP.
Java-файл с AsyncTasks:
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();
}
}
JSONParser.java:
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;
}
}
updateusersettings.php:
<?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));
}
?>
getusersettings.php:
<?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));
}?>
несколько AsyncTask, по умолчанию, не работает параллельно. Вы должны использовать метод executeOnExecutor: http://developer.android.com/reference/android/os/AsyncTask.html#executeOnExecutor%28java.util.concurrent.Executor,%20Params…%29
С помощью этого метода вы можете выполнять несколько AsyncTask параллельно.
В коде нет ничего плохого, у меня просто была опечатка в имени моего php-файла, когда я размещал его в Интернете. Решено.