2012-03-31 5 views
0

저는 비교적 새로운 Android 개발자이며이를 수행하는 방법을 이해할 수 없습니다. 나는 모든 포럼을 조사해 왔으며, 나는 약간의 진보를 이루었지만 아직도 여기 있습니다. 그래서 내가하고 싶은 것은 POST 요청을 웹 페이지에 보내고 (하나의 POST 인수 만 전송 함) 결과를 문자열로 반환하는 공통 함수입니다. 나는Async로 HttpPost 보내기 및 문자열 결과 받기

public class AppActivity extends Activity { 
    HTTPPostData PostData = new HTTPPostData("id"); 
    PostData.execute(); 
    txtLabel.setText(PostData.Result); 
} 

여기에 메인 쓰레드를하고 난

public class HTTPPostData extends AsyncTask<String, Long, Object> { 
String Value = null; 
String Result = null; 

public HTTPPostData(String query) { 
    Value = query; 
    } 

@Override 
protected String doInBackground(String... params) { 
    byte[] Bresult = null; 
     HttpClient client = new DefaultHttpClient(); 
     HttpPost post = new HttpPost("http://www.mypage.com/script.php"); 
     try { 
     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
     nameValuePairs.add(new BasicNameValuePair("cmd", Value)); 
      post.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8")); 
      HttpResponse response = client.execute(post); 
      StatusLine statusLine = response.getStatusLine(); 
      if(statusLine.getStatusCode() == HttpURLConnection.HTTP_OK){ 
       Bresult = EntityUtils.toByteArray(response.getEntity()); 
       Result = new String(Bresult, "UTF-8"); 
      } 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
     } 
     return Result; 
    } 
} 

내가 같은 활동 안에 (이 기능을 여러 번 사용하거나 같은 다른 활동들과 공유하고 싶은 내 HTTPPostData 비동기 클래스가 신청). 나는이 순간에 조금 엉망이되어 당신의 도움이 필요합니다. 내가 이해하는 것은 doInBackground()가 끝나기 전에 결과를 묻는 것이고, 나는 빈 결과를 얻는다.

이에 관해서는 당신의 도움이

답변

1

에 미리 감사드립니다 :

HTTPPostData PostData = new HTTPPostData("id"); 
PostData.execute(); 
txtLabel.setText(PostData.Result); 

귀하의 문제는 그냥 일반 함수처럼 당신이 AsyncTask를 치료하고 있다는 점이다. 웹 페이지 로딩을 메인 스레드에서 옮기는 것이 좋지만, 바로 다음 명령어에 대한 결과에 의존한다면, 그다지 잘하지 못하고 결과를 기다리는 메인 프로그램을 여전히 차단하고있는 것입니다. AsyncTask를 '화재 및 잊어 버리기'작업처럼 생각할 필요가 있습니다.이 작업에서는 언제 다시 작동하는지 알 수 없습니다.

뭔가 같은 것 여기에서 할 수있는 더 나은 일 :

HTTPPostData PostData = new HTTPPostData("id"); 
PostData.execute(); 
txtLabel.setText("Loading..."); 

다음 AsyncTask를에 :

이이 결과를 알지 못하고는 사업의 수행에 착수 주 스레드를 할 수 있습니다
protected void onPostExecute(String result) { 
    txtLabel.setText(result); 
} 

데이터가 사용 가능 해지 자마자 asynctask는 텍스트 레이블에 결과를 채 웁니다.

+0

응용 프로그램의 상황에 따라 공통된 클래스를 사용하는 것이 좋겠지 만 이제는 각각에 대해 비동기 클래스를 만들어야합니다. 예를 들어 숫자를 가져 와서 SharedPrefferences에 저장된 다른 항목과 비교 한 다음 문자열을 가져 와서 일부 TextView에 표시하려면 이러한 작업 각각에 대해 거의 동일한 코드가 포함 된 별도의 클래스를 만들어야합니다. . 아시다시피 비동기 클래스는 두 번 만들 수 없습니다. – ali

+0

@ali 나는 모든 Http-to-String 항목을 일반적인 유틸리티 함수에 넣었다. 그런 다음 인터넷 데이터를 얻고 자하는 각 장소에 공통 함수를 호출하는 barebone AsyncTask를 만든 다음 콜백 결과를 설명한다. onPostExecute에서 원한다. 아마도 여러 종류의 asynctask를 작성하는 데 낭비되는 느낌을 갖지만, 각각 다른 콜백을 수행해야합니다. 어쩌면 깨끗한 방법이 있을지 모르겠지만 확실하지 않습니다. 어쩌면 당신은 하나의 추상 asynctask 클래스를 생성 한 다음 그것을 사용하고자하는 모든 장소에서 onPostExecute를 재정의 할 수 있습니다. – Tim

+0

그게 내가 한거야. 감사! – ali