2016-04-12 6 views
1

私はサーバーから配列を受け取り、データtextviewを記入します。android - Теxtviewは即座に変更されません

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を別のスレッドで更新することはできません。 AsyncTaskOnPostExecuteで更新する必要があります。また、@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要素/ウィジェットを更新することができます。 、publishProgressonProgressUpdateを使用しようとか、あなたはそれがすぐにでなければならないことを決めたのはなぜ

0

onPostExecuteでこのすべてのスタッフを行うAsyncTaskは別々のスレッドを作成している、あなたは方法doInBackgroundからこれを行うことはできませんか?インターネットのスピード、pingなどによって異なります。progressBarを使用して何かが起こっていることをユーザーに示す、空の画面だけでなく数秒後にtextViewが表示されます。

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"); 

は、実際には例外がスローされますが、空のcatchステートメントは、クラッシュからアプリを防ぎます。

バックグラウンドスレッドからビューを更新することはできません。更新UIはUIスレッド上になければなりません。 AsyncTaskの場合、onPostExecuteまたはonProgressUpdateメソッドでこれを行うことができます。

それは文字列を返すように、あなたのdoInBackgroundの実装を変更:

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

、その後onPostExecuteに、からの応答を持ってまで、あなたは待つ必要がありますので、あなたは、サーバーを呼び出しているのTextView

protected onPostExecute(String result){ 
tv_number.setText(result); 
} 
関連する問題