2016-04-12 2 views
1

Я принимаю массив с сервера, а затем заполняю текстовое представление данных.android - Textview не изменяется мгновенно

private class ReadMessages extends  AsyncTask<Void, Void, Integer> 
{ 
    HttpURLConnection conn; 
    String ansver, bfr_st; 
    JSONArray JsonArray; 
    protected Integer doInBackground(Void... params) { 
     try { 
     String post_url = server_name +"/chat.php?action=select"; 
     conn = (HttpURLConnection) new URL(post_url).openConnection(); 
     conn.setReadTimeout(10000); 
     conn.setConnectTimeout(15000); 
     conn.setRequestMethod("GET"); 
     conn.setRequestProperty("User-Agent", "Mozilla/5.0"); 
     conn.setDoInput(true); 
     conn.connect(); 

     InputStream is = conn.getInputStream(); //канал 
     BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8")); //буфер 
     StringBuilder sb = new StringBuilder(); //сборщик строки 
     while ((bfr_st = br.readLine()) != null) { 
      sb.append(bfr_st); //получили массив в виде string 
     } 

     String json_bum = sb.toString(); 
     JsonArray = new JSONArray(json_bum); //преобразовали string обратно в массив 

     for (int i=0; i<JsonArray.length(); i++) { 
      jsonObject = JsonArray.getJSONObject(i); //вынули все обьекты 
     } 
     tv_number.setText("Номер  - " + jsonObject.getInt("_id") + 
        "\n" 
         + "Автор -  " + jsonObject.getString("author") + 
         "\n" 
         + "Адресат  - " + jsonObject.getString("client") + 
         "\n" 
         + "Время -  " + jsonObject.getLong("data") + 
         "\n" 
         + "Текст - "  + jsonObject.getString("text") + 
         "\n"); 

      is.close(); 
      br.close(); 

      } catch (Exception e) { 

      } finally { 

       conn.disconnect(); 
      } 
      return null; 
     } 


     } 

Когда я складываю приложение, а затем возвращаюсь к нему, текст меняется. но сразу же, когда вы нажимаете кнопку, которой не бывает

+0

вы вызываете сервер, так что вы должны ждать, пока есть реагировать с это, и это зависит от множества разных факторов, чтобы думать, что это будет немедленно –

ответ

0

Вам не разрешено обновлять GUI в отдельной теме. Вы должны обновить его в OnPostExecute в своем AsyncTask. Кроме того, вы должны @OverridedoInBackground.

private class ReadMessages extends AsyncTask<Void, Void, Integer> { 
    HttpURLConnection conn; 
    String ansver, bfr_st; 
    JSONArray JsonArray; 

    @Override 
    protected Integer doInBackground(Void... params) { 
     try { 
     String post_url = server_name +"/chat.php?action=select"; 
     conn = (HttpURLConnection) new URL(post_url).openConnection(); 
     conn.setReadTimeout(10000); 
     conn.setConnectTimeout(15000); 
     conn.setRequestMethod("GET"); 
     conn.setRequestProperty("User-Agent", "Mozilla/5.0"); 
     conn.setDoInput(true); 
     conn.connect(); 

     InputStream is = conn.getInputStream(); //канал 
     BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8")); //буфер 
     StringBuilder sb = new StringBuilder(); //сборщик строки 
     while ((bfr_st = br.readLine()) != null) { 
      sb.append(bfr_st); //получили массив в виде string 
     } 

     String json_bum = sb.toString(); 
     JsonArray = new JSONArray(json_bum); //преобразовали string обратно в массив 

     for (int i=0; i<JsonArray.length(); i++) { 
      jsonObject = JsonArray.getJSONObject(i); //вынули все обьекты 
     } 
      is.close(); 
      br.close(); 

      } catch (Exception e) { 

      } finally { 

       conn.disconnect(); 
      } 
      return null; 

     } 

     @Override 
     protected void onPostExecute(String result) { 
      tv_number.setText("Номер  - " + jsonObject.getInt("_id") + 
        "\n" 
        + "Автор -  " + jsonObject.getString("author") + 
        "\n" 
        + "Адресат  - " + jsonObject.getString("client") + 
        "\n" 
        + "Время -  " + jsonObject.getLong("data") + 
        "\n" 
        + "Текст - "  + jsonObject.getString("text") + 
        "\n"); 
    } 
2

Вы можете обновлять элементы/виджеты GUI только из основной темы приложения. AsyncTask создает отдельный поток и вы не можете сделать это из метода doInBackground, попробуйте использовать publishProgress и onProgressUpdate или делать весь этот штат в onPostExecute

0

Почему вы решили, что это должно быть немедленно? Это зависит от вашей скорости интернета, ping и т. Д. Хорошая практика заключается в использовании progressBar, чтобы показать пользователю, что что-то происходит, а не только пустой экран, а затем текст через несколько секунд появляется.

0

Линия в doInbackground:

tv_number.setText("Номер  - " + jsonObject.getInt("_id") + 
        "\n" 
         + "Автор -  " + jsonObject.getString("author") + 
         "\n" 
         + "Адресат  - " + jsonObject.getString("client") + 
         "\n" 
         + "Время -  " + jsonObject.getLong("data") + 
         "\n" 
         + "Текст - "  + jsonObject.getString("text") + 
         "\n"); 

фактически бросает исключение, но пустой оператор задвижки предотвращает приложение от сбоя.

вы не можете обновлять представления из фонового потока, обновление пользовательского интерфейса должно быть в потоке пользовательского интерфейса. В случае AsyncTask вы можете сделать это в onPostExecute или onProgressUpdate методов.

изменения в вашей реализации doInBackground, сделать его возвращать строку:

protected String doInBackground(Void... params){ 
} 

затем в onPostExecute, обновите TextView

protected onPostExecute(String result){ 
tv_number.setText(result); 
} 
Смежные вопросы