2012-03-06 4 views
0

다른 사람이이 문제를 찾을 수 있기를 바랍니다. 나는 서버 통신에 완전히 종사하고있는 앱을 가지고 있었다. 불행히도 필자는 Windows 8 CP로 이동할 때 어떻게 든 Eclipse 작업 영역을 잃어 버렸습니다. 저는 여전히 .apk 파일을 가지고 있고 Dex2jar와 jd-gui를 사용하여 많은 코드를 복구 할 수있었습니다. 나는 모든 것을 다시 작동 상태로 되돌려 놓았지만, 이것은. 나는 서버에 URL을 보내려고하고 문자열 응답을 되 찾으려고합니다. 코드는 다음과 같습니다.Android HTTP 클라이언트 문제

import org.apache.http.client.HttpClient; 
import org.apache.http.client.ResponseHandler; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.BasicResponseHandler; 
import org.apache.http.impl.client.DefaultHttpClient; 

public class login extends Activity{ 

<code> 

public void pushLogin(View paramView){ 

    try{ 
    HttpClient client = new DefaultHttpClient(); 
    HttpGet request = new HttpGet(loginFinal); 
    ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
    errorTextView.setText(loginFinal); 

    //code gets here 
    String response = client.execute(request, responseHandler); 
    //does not get here 
    errorTextView.setText(response); 
    } 

내 TextView에는 항상 loginFinal이라는 문자열이 포함되어있어 응답을 표시 할 수 없습니다. 이를 확인하기 위해 문자열 응답을 얻으려고 시도한 후 errorTextView.setText(loginFinal);을 줄로 이동했습니다. 그 시점에서 실행되지 않았습니다. 나는 머리카락을 찢어 내고있어, 나는 그것이 단순한 것이라고 확신한다. 나는 인터넷 허가를 받았고, 나는이 사이트에서이 부분에 대한 나의 원래 코드를 발견했다. 나는 별도의 질문을 던졌다. 이 코드는 내가 알 수있는 한 동일합니다. 내가 생각할 수있는 유일한 사실은 내가 Froyo에서 Honeycomb로 빌드 타겟을 옮겼다는 것인데, 나는 정제에 집중하기로 결정했다.

가장 중요한 부분은 내가 누를 때 LogCat이 아무 것도하지 않고 pushLogin을 트리거한다는 것입니다. client.execute(request, responseHandler)을 전혀 트리거하지 않는 것 같습니다.

+0

client.execute가 예외를 throw하는지 확인하지 않는 이유는 무엇입니까? 연락하려는 서버가 실제로 켜져 있습니까? – dbryson

+0

try {} 다음에 catch 블록에 무엇이 있습니까? client.execute 다음에 행을 실행하지 않는다고 말하면 예외가 발생한다고 가정해야합니다. 디버거를 밟았습니까? – Tim

+0

나는 캐치 방법을 사용했다. 나는 아직도 이것에 대해 매우 새로운 것이지만, 나는 이것이 어떤 형태의 오류를 건져야한다는 인상 아래에있다. catch (예외 e) { Toast.makeText (this, e.getMessage(), Toast.LENGTH_LONG); ' 토스트 오류가 없습니다. 뭔가 잘못이다? –

답변

0

UI 스레드에서 pushLogin()을 호출했을 가능성이 있습니다. API 레벨 11 (HONEYCOMB) (즉, HttpClient 및 HttpUrlConnection 포함)이 UI에서 실행되도록 허용하지 않기 때문에 스레드 정책이 변경되었습니다 그렇지 않으면 NetworkOnMainThreadException을 얻습니다. 올바른 전략은 백그라운드 스레드 (좋은 예로서 AsycnTask)에서 pushLogin()을 호출하는 것입니다.

희망 도움말.

+0

그게 다야, 고마워. 나는 그것을 asynch 작업으로 옮길 계획이다. 사실, 그것은 내가 코드를 잃어 버렸을 때 내가 작업했던 것입니다. 그러나, 나는 새로운 것을 시도하기 전에 중단했던 곳으로 돌아가고 싶었다. 호기심에서 벗어나서 구축 목표에 기반한 정책이 무엇입니까? 내가 물어 보는 이유는 동일한 ICS 전화의 UI 스레드에서 http 통신을 사용하여 (기본적으로) 동일한 코드를 실행했기 때문이며 대상이 11이 아닌 8 일 때 정상적으로 실행되었습니다. 다시 도움을 청합니다! –

+0

이것이 if 조건 테스트 내부에있는 이유입니다. StrictMode.ThreadPolicy는 API 레벨 9 이후에 도입되었습니다. 런타임에 조건이 점검됩니다. 내가 게시 한 코드는 모든 Android 버전에서 작동합니다. – yorkw