2012-10-27 4 views
0

계속해서 새로운 AsyncTask을 호출하는 다음 코드를 참조하십시오. AsyncTask의 목적은 HTTP 요청을 만들고 문자열 result을 업데이트하는 것입니다.AsyncTask를 사용했지만 예기치 않은 동작이 발생했습니다.

package room.temperature; 

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 
import java.util.concurrent.ExecutionException; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 

public class RoomTemperatureActivity extends Activity { 

    String result = null; 
    StringBuilder sb=null; 

    TextView TemperatureText, DateText; 
    ArrayList<NameValuePair> nameValuePairs; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     TemperatureText = (TextView) findViewById(R.id.temperature); 
     DateText = (TextView) findViewById(R.id.date); 
     nameValuePairs = new ArrayList<NameValuePair>(); 

     for (int i = 0; i < 10; i++) {   
      RefreshValuesTask task = new RefreshValuesTask(); 
      task.execute(""); 
     } 
    } 

    // The definition of our task class 
    private class RefreshValuesTask extends AsyncTask<String, Integer, String> { 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 

     @Override 
     protected String doInBackground(String... params) { 
      InputStream is = null; 

      try { 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpPost httppost = new HttpPost("http://mywebsite.com/roomtemp/tempscript.php"); 
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 
       is = entity.getContent(); 
      } 

      catch(Exception e) { 
       Log.e("log_tag", "Error in http connection" + e.toString()); 
      } 

      try { 
       BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
       sb = new StringBuilder(); 
       sb.append(reader.readLine()); 
       is.close(); 
       result=sb.toString(); 
      } 

      catch(Exception e) { 
       Log.e("log_tag", "Error converting result " + e.toString()); 
      } 

      return result; 
     } 

     @Override 
     protected void onProgressUpdate(Integer... values) { 
      super.onProgressUpdate(values); 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
      //System.out.println(result); 
      setValues(result); 
     } 
    } 

    public void setValues(String resultValue) { 
     System.out.println(resultValue); 
     String[] values = resultValue.split("&"); 

     TemperatureText.setText(values[0]); 
     DateText.setText(values[1]); 
    } 
} 

내가 경험하고 문제는 어떤 방법이나 기능 setValues()AsyncTask에 관한 것으로,하지만 난 방법을 잘 모르겠습니다. 본질적으로, AsyncTask에 대한 각 호출을 무한 while 루프에서 실행하고 TextView 필드를 업데이트하려는 경우 setValues에서 시도했습니다. 어제 이후 나는이 코드를 참조한 question을 물어 본 후 어제부터 시도해 보았습니다.

네 오, 나는 AsyncTask get() 방법을 사용하여 시도했지만 그게 내가 실제로 동기 호출하고, 쓸모 AsyncTask의 요점을 렌더링하는 것을 발견 중 하나로 작동하지 않았다.

+0

을 그리고 당신이 직면하고 정확한 문제는 무엇인가 :

그래서 다음에 코드를 변경? 오류? 또는 출력 없음? –

답변

1

메서드에서 일부 작업을 실행하는 동안 진행을 게시하려면 publishProgress()onProgressUpdate() 메서드를 사용하십시오.

package room.temperature; 

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 
import java.util.concurrent.ExecutionException; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 

public class RoomTemperatureActivity extends Activity { 

    String result = null; 
    StringBuilder sb=null; 

    TextView TemperatureText, DateText; 
    ArrayList<NameValuePair> nameValuePairs; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     TemperatureText = (TextView) findViewById(R.id.temperature); 
     DateText = (TextView) findViewById(R.id.date); 
     nameValuePairs = new ArrayList<NameValuePair>(); 

     RefreshValuesTask task = new RefreshValuesTask(); 
     task.execute(""); 
    } 

    // The definition of our task class 
    private class RefreshValuesTask extends AsyncTask<String, Integer, String> { 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 

     @Override 
     protected String doInBackground(String... params) { 
      InputStream is = null; 
      for (int i = 0; i < 10; i++) {   

      try { 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpPost httppost = new HttpPost("http://mywebsite.com/roomtemp/tempscript.php"); 
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 
       is = entity.getContent(); 
      } 

      catch(Exception e) { 
       Log.e("log_tag", "Error in http connection" + e.toString()); 
      } 

      try { 
       BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
       sb = new StringBuilder(); 
       sb.append(reader.readLine()); 
       is.close(); 
       result=sb.toString(); 
       publishProgress(result); 
      } 

      catch(Exception e) { 
       Log.e("log_tag", "Error converting result " + e.toString()); 
      } 
      } 
      return result; 
     } 

     @Override 
     protected void onProgressUpdate(String... values) { 
      super.onProgressUpdate(values); 
      setValues(values); 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
      //System.out.println(result); 
      setValues(result); 
     } 


    } 

    public void setValues(String resultValue) { 
     System.out.println(resultValue); 
     String[] values = resultValue.split("&"); 

     TemperatureText.setText(values[0]); 
     DateText.setText(values[1]); 
    } 
} 
+1

onCreate()에서 AsyncTask doInBackground()로 move for loop를 제안하십시오. 따라서 10 개의 AsyncTask 인스턴스를 만들 필요가 없습니다. – Wenhui

+0

귀하의 제안에 따라 변경해 주셔서 감사합니다. – jeet

+0

@Wenhui 나는 이것을 시도하고 그것이 작동하는 것처럼 보이지만 Eclipse에서 이상한 문제가 발생했습니다. 내'setValues ​​(values);'호출에서 IDE에서 'RoomTemperatureActivity 유형의 메서드 setValues ​​(String)이 인수 (String [])에 적용 할 수 없습니다.'라는 오류가 발생했습니다. 제네릭 유형을 String으로 변경하고'protected void onProgressUpdate (String ... values)'로 변경하여 왜이 오류가 발생하는지 보지 못했습니다. 감사! – capcom

관련 문제