2017-05-31 15 views
0

私の問題について説明します。httpリクエストを実行するときのレイアウト要素の変更

私は以前のアクティビティからデータを取得するアクティビティを持っています。私のボタンをクリックすると、メソッドinvokeSendQuestionChoose()が実行されます。

このメソッドは2つのアクションを実行します。つまり、2つの異なるリソースに対してhttpリクエストを送信します。

最初のリソースは/ nextquestionです。私は、の新しい回収情報で、チェックボックスとTextViewを更新したいと思います。

のOnCreate:

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

    idQuestion = (Integer) getIntent().getSerializableExtra("idQuestion"); 
    question = (String) getIntent().getSerializableExtra("question"); 
    answer = (String) getIntent().getSerializableExtra("answer"); 


    btn_yes = (Button) findViewById(R.id.btn_yes); 
    tv_title_question.setText(question); 
    cb_title = (CheckBox) findViewById(R.id.cb_title); 

    ... 
} 

方法と、ボタンのクリック:

public void invokeSendQuestionChoose(View view){ 

    invokeSendQuestionChoose(); 
    invokeNextQuestion(); 

} 

メソッドのHTTPリクエスト:

private void invokeNextQuestion(){ 

    class NextQuestionChooseAsync extends AsyncTask<String, Void, ArrayList<String>> { 

     private Dialog loadingDialog; 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      // loadingDialog = ProgressDialog.show(QuestionActivity.this, "Please wait", "Loading..."); 
     } 

     @Override 
     protected ArrayList<String> doInBackground(String... params) { 

      ... 

      try { 
       //Http request to communicate with our system 
       HttpClient httpClient = new DefaultHttpClient(); 

       List<BasicNameValuePair> parameters = new LinkedList<BasicNameValuePair>(); 
       parameters.add(new BasicNameValuePair("idsession", String.valueOf(idSession))); 


       HttpGet httpGet = new HttpGet(); 
       URI website = new URI("http://192.168.43.32:5001/nextquestion" + "?"+ URLEncodedUtils.format(parameters, "utf-8")); 
       httpGet.setURI(website); 

       String base64EncodedCredentials = Base64.encodeToString(
         (email + ":" + password).getBytes(), 
         Base64.NO_WRAP); 

       Log.d("test",base64EncodedCredentials); 

       httpGet.setHeader("Authorization", "Basic " + base64EncodedCredentials); 

       HttpResponse response = httpClient.execute(httpGet); 

       statusCode = response.getStatusLine().getStatusCode(); 

       HttpEntity entity = response.getEntity(); 
       is = entity.getContent(); 

       BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 8); 
       StringBuilder sb = new StringBuilder(); 

       String line = null; 
       while ((line = reader.readLine()) != null) { 
        sb.append(line + "\n"); 
       } 
       result = sb.toString(); 

       Log.d("result1", result); 

       //Manage JSON result 
       JSONObject jsonObject = new JSONObject(result); 

       question = jsonObject.getString("question"); 
       idQuestion = jsonObject.getInt("idquestion"); 

       questionInformation.add(question); 
       questionInformation.add(String.valueOf(idQuestion)); 

      } catch (ClientProtocolException e) { 
       e.printStackTrace(); 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } catch (URISyntaxException e) { 
       e.printStackTrace(); 
      } 

      return questionInformation; 

     } 

     @Override 
     protected void onPostExecute(ArrayList<String> status) { 
      //loadingDialog.dismiss(); 
      //findViewById(R.id.cb_fond).invalidate(); 
      String question = questionInformation.get(0); 
      int idQuestion = Integer.valueOf(questionInformation.get(1)); 


      tv_title_question.setText(question); 


     } 
    } 
    NextQuestionChooseAsync nqca = new NextQuestionChooseAsync(); 
    nqca.execute(); 
} 

どのように私は私の問題を解決することができますか?

ありがとうございます。

答えて

0

NextQuestionChooseAsyncクラスを独自のファイルに置き、変更するビューのプライベートフィールドを作成し、アクティビティからコンストラクタ内のNextQuestionChooseAsyncに渡します。 WeakReferenceを使用すると、アクティビティとテキストビューがasynctask中に破棄された場合にリークメモリが発生しません。

NextQuestionChooseAsync class NextQuestionChooseAsync extends AsyncTask<String, Void, ArrayList<String>> { 
    private WeakReference<TextView> mTvTitleReference; 
    private Dialog loadingDialog; 

    public NextQuestionChooseAsync(TextView tvTitleTextView) { 
     super(); 
     mTvTitleReference = new WeakReference<>(tvTitleTextView); 
    } 
    @Override 
    protected void onPostExecute(ArrayList<String> status) { 
     //loadingDialog.dismiss(); 
     //findViewById(R.id.cb_fond).invalidate(); 
     String question = questionInformation.get(0); 
     int idQuestion = Integer.valueOf(questionInformation.get(1)); 
     if (mTvTitleReference.get() != null) { 
      mTvTitleReference.get().setText(question); 
     } 
    } 
    // the rest of your code 

とあなたのinvokeNextQuestion()

private void invokeNextQuestion() { 
    NextQuestionChooseAsync nextquestionTask = new NextQuestionChooseAsync(tv_title_question); 
    nextquestionTask.execute(/**put your paramters here if needed**/); 
} 
中:そう同様

関連する問題