2015-11-29 2 views
1

У меня есть приложение для Android, которое извлекает данные из mysql db через php. Он отлично работает, но у меня есть (простая) проблема переменных.Java android and json - переменная путаницы

Я хочу создать переменную внутри класса MainActivity. Затем в классе MainActiviy у меня есть метод onCreate - и внутри этого у меня есть некоторый материал json, который извлекает мои данные из mysql.

Теперь я хочу присвоить значение mysql переменной i, созданной в классе MainActivity (она назначается внутри метода onResponse из материала json), а затем я просто хочу использовать эту переменную и записать ее в текстовом виде, и я сделаю это в нижней части метода onCreate.

Но по какой-то причине он «забывает» значение, присвоенное переменной, когда я должен использовать его вне метода onResponse. (если я устанавливаю текст текста в методе onResponse, он отлично работает).

public class MainActivity extends ActionBarActivity { 

    // I create the variable here 
    String someString; 

    TextView text; 

    RequestQueue reqq; 
    String showUrl = "http://www.someurl.com/get_data.php"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     text = (TextView) findViewById(R.id.textid); 

     reqq = Volley.newRequestQueue(getApplicationContext()); 
     JsonObjectRequest jsonob = new JsonObjectRequest(Request.Method.POST, 
       showUrl, new Response.Listener<JSONObject>() { 
      @Override 
      public void onResponse(JSONObject response) { 
       try { 
        JSONArray dataAr = response.getJSONArray("json_data"); 
        for (int i = 0; i < dataAr.length(); i++) { 
         JSONObject dat = dataAr.getJSONObject(i); 

         // Here I want to assign some data from my mysql db to the variable 
         someString = dat.getString("aar"); 

         // If I set the the textview to display value of someString HERE, it works! 
         // text.setText(someString); 

        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       System.out.println(error.getMessage()); 
      } 
     }); 

     reqq.add(jsonob); 

     // HERE i want to display the value of the variable in the textview! 
     // - but it doesnt "remember" the value 
     text.setText(someString); 

    } 
} 

Если я использую статический ключевое слово в переменной SomeString, он запоминает значение, но только во второй раз я открыть приложение!

Я очень новичок в этом, и попробовал Google, и попробовал кое-что с одноэлементным классом, но я просто не понимаю этого!

Мне понравилось бы, если бы кто-то мог связать мне некоторую информацию, чтобы помочь мне получить это, И привести пример того, как мой код должен быть, так что это сработает!

СПАСИБО! : D

ответ

0

Такое поведение связано с тем, что

text.setText(someString); 

немедленно выполнен в onCreate методом, & немедленным я имею в виду, что не ждать какого-либо ответа от запроса Volley (Волейбол, который вы задали ранее). Другими словами, вам нужно подождать, пока вы не получите response, прежде чем вы установите текст на свой TextView.

Именно поэтому он успешно задает ваш текст TextView с помощью метода onResponse.

+0

Это определенно имеет смысл! Не могли бы вы привести пример о том, как подождать, пока после ответа на установку текста? – Simun

+0

Вы делаете это правильно: просто установите текст textview из метода 'onResponse'. Это единственный способ. –

+0

О, ладно. Проблема в том, что приведенный выше код является примером того, что я делаю. Мне нужно использовать переменную someString для других вещей вне метода onResponse. Не существует способа «подождать ответа» вне метода onResponse, а затем сделать что-нибудь? – Simun

Смежные вопросы