Внутренние методы, изменяющие глобальные переменные, не сохраняются, android/java

#java #php #android #mysql #debugging

Вопрос:

Это мой первый раз, когда я работаю с Android/базой данных, поэтому я немного теряюсь в том, что делать, любая помощь приветствуется. Я попытался найти возможные ошибки в Интернете, но застрял, так как не знаю, как описать то, что я вижу.

 private static Maplt;String, Stringgt; returnMap;  

У меня есть хэш-карта, которая содержит значения SQL-запроса, и я хотел бы, чтобы мой метод возвращался к действию, которое его вызвало.

 public Maplt;String, Stringgt; sql_query(final String sqlStatement, final Context context){  returnMap = new HashMaplt;gt;();   returnMap.put("success", "0");  returnMap.put("data", "TEST");   mRequestQueue = Volley.newRequestQueue(context);  mStringRequest = new StringRequest(Request.Method.POST, querySqlURL(context, "run_query.php"), new Response.Listenerlt;Stringgt;(){  @Override  public void onResponse(String response) {  try {  JSONObject jsonObject = new JSONObject(response);   String success = jsonObject.getString("success");  String message = jsonObject.getString("message");   if (success.equals("1")) {  Toast.makeText(context, message, Toast.LENGTH_SHORT).show();  returnMap.put("success", success);  returnMap.put("data", message);   }  } catch (JSONException e) {  Log.e("Debug", response);  returnMap.put("success", "0");  returnMap.put("data", e.toString());  //Toast.makeText(context, e.toString(), Toast.LENGTH_SHORT).show();  }  }  }, new Response.ErrorListener(){  @Override  public void onErrorResponse(VolleyError error){  //Toast.makeText(context, error.toString(), Toast.LENGTH_SHORT).show();  returnMap.put("success", "0");  returnMap.put("data", error.toString());  }  }) {  @Override  protected Maplt;String, Stringgt; getParams() throws AuthFailureError {  Maplt;String, Stringgt; params = new HashMaplt;gt;();  //params.put("sql", "INSERT INTO test_table(text) VALUES('"   text   "')");  params.put("sql", sqlStatement);   return params;  }  };  mStringRequest.setShouldCache(false);  mRequestQueue.add(mStringRequest);  Toast.makeText(context, returnMap.get("success")   " "   returnMap.get("data"), Toast.LENGTH_SHORT).show();  return returnMap; }  

Я подтвердил, что эта часть поступает, так как окно тостов может отображать данные, которые я пытаюсь получить.

 if (success.equals("1")) {  Toast.makeText(context, message, Toast.LENGTH_SHORT).show();  returnMap.put("success", success);  returnMap.put("data", message);   }  

Но я не уверен, почему returnMap всегда возвращает значения 0 и ТЕСТ, который установлен сверху для целей тестирования.

Это моя основная деятельность

 postRequest.setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View v) {  // TODO: Insert in data to test_table  Maplt;String,Stringgt; returnTable = database.sql_query("SELECT * FROM test_table", MainActivity.this);  Toast.makeText(MainActivity.this, returnTable.get("success")   " "   returnTable.get("data"), Toast.LENGTH_SHORT).show();  if (returnTable.get("success").equals("1")) {  // Successful  postRequest.setText("Select");  tempText.setText(returnTable.get("data"));  //Toast.makeText(MainActivity.this, "Successfully grabbed data", Toast.LENGTH_SHORT).show();  } else {  // Fail  postRequest.setText("Select fail");  tempText.setText(returnTable.get("data"));  //Toast.makeText(MainActivity.this, "Failed to add to database!", Toast.LENGTH_SHORT).show();  }  }  }); }  

Произнесение тоста сразу после установки значений в hashmap, если успех равен «1», выводит правильное значение, но печать его прямо перед возвращением отображает 0 и проверяет agn, без установки значений по умолчанию сверху, похоже, возвращает значение null. Я считаю, что это должно произойти, поскольку успех и данные устанавливаются в каждом сценарии, но я мог что-то упустить. У меня есть несколько предложений от друзей, которые могут предположить, что onResponse может быть асинхронным, но я не уверен, так ли это, и если да, то что делать, чтобы решить эту проблему, все помогает!