2012-03-07 2 views
0

저는 지난 몇 주 동안 안드로이드에 어려움을 겪어 왔고, 나 자신이 첫 번째 작업 응용 프로그램이되었습니다. 나는 정말 누군가가 내 안드로이드 장치 (들)에서 작동하도록 나를 도울 수 있기를 바랍니다. 에뮬레이터는 v2.2를 실행하고 내 장치는 2.3 이상입니다.안드로이드 HTTP 앱이 에뮬레이터에서 제대로 작동하지 않습니다. 내 휴대폰에서 제대로 작동하지 않습니다.

나는 'Application'을 확장하는 클래스에 의해 만들어지는 beeing이라는 싱글 톤 'websiteservice'클래스를 가지고있다. websiteservice-class는 1 개의 threadsafeconnection-manager를 만들고 'CookieStore'를 포함합니다. 각 HTTPGet/Post는 threadsafeconn.manager가 첨부 된 새 HTTPClient를 만듭니다. 매번 게시물을 올리거나 얻을 때마다 가능한 경우 쿠키를 첨부하려고합니다. 쿠키는 웹 사이트의 보안 된 부분에 로그인 할 때 한 번만 설정됩니다. EntitityUtils.ToString 및 Jsoup와 함께, 나는 '보안 된'웹 사이트 부분의 각 HTML 결과를 구문 분석합니다. 로그온 할 때, 나는 로그인 한 사용자 인 단 하나의 간단한 레코드 만 저장하는 안드로이드에 sqllite 테이블을 생성합니다.

내 에뮬레이터에서이 프로그램을 실행하면 모든 것이 제대로되고 싶지만 내 장치에서는 무언가 잘못되었다고 생각됩니다. 디버거를 휴대 전화에 연결했습니다. 로그인이 잘된 것처럼 보이며 쿠키가 설정 중입니다. sqllite 비트는 아마도 오류가 발생하지 않는 것처럼 잘 진행됩니다. 프로필 페이지를로드 할 때 HTTPGet-action은 CookieStore의 첨부 된 쿠키를 가져 오지만받은 HTML 결과/문서는 로그인 페이지의 95 %를 차지하는 것으로 나타났습니다.

내 뿌리 째 Desire HD에서 한 번 또는 두 번 내 프로필 페이지를 보았으므로 95 %라고하지만 다른 Desire HD에서는 내 Sensation XE에도 없었습니다. 프로필 페이지가로드 된 시간 (해시 맵을 입력으로 사용하는 사용자 지정 목록 상자)이 실행되면 아무런 작업도 시작할 수 없습니다. 그들은 즉시 중단되었고, 아마 같은 문제 (결과로 로그인 페이지를 얻는 것)가있었습니다.

내가 잊어 버린 권한이 있습니까? 내가 확인해야 할 것이 있습니까? 아니면 무엇이 될 수 있는지 알 수 있습니까? 나는 지금 정말로 혼란 스럽다.

작은 업데이트
방금 ​​휴대 전화를 재부팅했습니다. 프로그램을 시작할 때 처음 로그온 할 때 프로필 페이지가로드됩니다. 내 '디테일'액션이 효과가있는 것 같습니다. 이 작업은 인터넷에 연결되지 않거나 클래스에 저장된 정보 만 표시합니다. 다른 두 가지 작업 (복사 및 삭제)이 작동하지 않습니다. 결과적으로 '로그인 페이지'가 표시됩니다. 화면 (방향 변경)을 돌리면 페이지가 다시 시작되고 프로필 페이지를 다시로드하려고합니다. 목록 상자가 지워지고 프로필 페이지 (광고 목록)가 다시 표시되지 않습니다.

업데이트 2 - 08-03 내 매니페스트 파일에는 내 활동 등록 외에 인터넷 사용 권한 만 포함되어 있습니다. 작은 '별난'추가. 내 '백업'코드는 여기에 게시 된 코드와 거의 같습니다. 매번 쿠키를 첨부하는 것처럼 보이지만 여전히 그걸로 아무것도하지 않습니다. (또한 어제는 휴대 전화로 조금 놀고 있었고, 나는 몇 번이나 orentiation을 변경했습니다 (자동으로 활동을 다시 불러옵니다). 그리고 갑자기, 나는 한두 번 내 프로파일을 앞에 두었습니다. 나는 아무런 조치도 취할 수 없었지만, 정보를 담고있는 클래스는 접근 가능하고 충만했습니다. 지금은 오전 8.15시에, 전환 한 후에 다시 프로파일을로드 할 수있었습니다. 방향으로 4 ~ 5 시간.

업데이트 2012년 8월 3일 내가 수수께끼과 저녁에 많은 것들을 시도하고, 한 지금은 심지어 다시 원점으로 1. 내 에뮬레이터 버전을 가지고 백업있어, 그래서 np,하지만 난 내 http-client 제대로 사용하지 않는 것 같아요. 이전 코드를 모두 제거한, 내 'websiteservice'에 사용하는 내 현재 코드 및 내 'Webclient' 나는 connectionmanager를 붙임으로써 각 get/post에서 인스턴스화한다.

private static WebsiteService instance; 

    ThreadSafeClientConnManager manager; 
    HttpContext localContext; 
    CookieStore cookies; 
    public String returnCode = ""; 
    public HttpPost httpPost = null; 
    public HttpGet httpGet = null; 

    public static WebsiteService getInstance() 
    { 
     // Return the instance 
     return instance; 
    } 

    private WebsiteService() 
    { 
     DefaultHttpClient client = new DefaultHttpClient(); 
     ClientConnectionManager mgr = client.getConnectionManager(); 
     HttpParams params = client.getParams(); 
     manager = new ThreadSafeClientConnManager(params,mgr.getSchemeRegistry()); 
     localContext = new BasicHttpContext(); 
     cookies = new BasicCookieStore(); 
     localContext.setAttribute(ClientContext.COOKIE_STORE, cookies); 
    } 

    public static void initInstance() 
    { 
     if (instance == null) 
      instance = new WebsiteService(); 
    } 

    public WebsiteClient postPage(String url, List<NameValuePair> nvps) 
    { 
     return postPage(url, nvps, true); 
    } 

    public WebsiteClient getPage(String url) { 

     WebsiteClient client = new WebsiteClient(manager); 
     DefaultHttpClient httpClient = client.httpClient; 

     httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY); 
     //HttpProtocolParams.setContentCharset(httpClient.getParams(), "CP1250"); 

     if(cookies != null) 
      httpClient.setCookieStore(cookies); 

     httpGet = new HttpGet(url); 

     try { 
      client.response = httpClient.execute(httpGet,localContext); 
     } catch (ClientProtocolException e) { 
      System.out.println("HTTPService : ClientProtocolException : "+e.getMessage()); 
      return null; 
     } catch (IOException e) { 
      System.out.println("HTTPService : IOException : "+e); 
      return null; 
     } 

     //cookies = httpClient.getCookieStore(); 
     return client; 
    } 


    public WebsiteClient postPage(String url, List<NameValuePair> nvps, boolean autoRedirect) { 

     WebsiteClient client = new WebsiteClient(manager); 
     DefaultHttpClient httpClient = client.httpClient; 
     httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY); 

     if(cookies != null) 
      httpClient.setCookieStore(cookies); 

     if(!autoRedirect) 
     { 
      HttpParams params = httpClient.getParams(); 
      HttpClientParams.setRedirecting(params, false); 
     } 

     httpPost = new HttpPost(url); 
     client.response = null; 
// 
     httpPost.setHeader("User-Agent", "Mozilla/5.0 (X11; U; Linux " + 
       "i686; en-US; rv:1.8.1.6) Gecko/20061201 Firefox/2.0.0.6 (Ubuntu-feisty)"); 
     httpPost.setHeader("Accept", "text/html,application/xml," + 
       "application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"); 
     httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded"); 

     try { 
      if(nvps != null) 
       httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.ISO_8859_1)); 
     } catch (UnsupportedEncodingException e) { 
      // TODO Auto-generated catch block 
      System.out.println("HTTPHelp : UnsupportedEncodingException : "+e); 
     } 
     //httpPost.setEntity(tmp); 

     try { 
      client.response = httpClient.execute(httpPost, localContext); 
     } catch (ClientProtocolException e) { 
      System.out.println("HTTPService : ClientProtocolException : "+e.getMessage()); 
      return null; 
     } catch (IOException e) { 
      System.out.println("HTTPService : IOException : "+e); 
      return null; 
     } 

     cookies = httpClient.getCookieStore(); 
     return client; 
    } 
} 

내 websiteclient : 나는 쿠키 뭔가 잘못하고 있어야합니다, 또는 Httpget/Httppost거나 동일한를 사용해서는 안

public DefaultHttpClient httpClient; 
public HttpResponse response = null; 

public WebsiteClient(ThreadSafeClientConnManager manager) 
{ 
    DefaultHttpClient client = new DefaultHttpClient(); 
    HttpParams params = client.getParams(); 
    httpClient = new DefaultHttpClient(manager, params); 
} 

. 바라기를 나는 내일 다시 명확한 마음으로 이것을 해결할 수있을 것이다.

아이디어와 의견을 보내 주시면 감사하겠습니다.

+0

코드를 올리면 더 잘 볼 수 있습니다. 서둘러 집 =) – androidnoob

+0

할 수있을 때 그렇게 할 것입니다. 방금 일을 시작한 지 얼마되지 않았지만, 나는 이미 내 질문을 올릴 충동을 느꼈다. 지금부터 7-8 시간 후에, 내 질문을 업데이트 할 수있을 것이다. 나는 컨텍스트 - 매니지먼트 (context-management) 나 어떤 것을 놓칠 수도있는 그런 느낌을 가지고있다. 내가 전에 그렇게 해본 적이 없기 때문에 모든 종류의 스레드에 대한 정보를 얻었으므로 지금 얻은 결과가되었습니다. – Honnes

+0

코드 게시 주셔서 감사합니다. 매니페스트 XML에 정의한 권한을 추가 할 수 있습니까? – androidnoob

답변

1

나는이 매우 어색한 문제를 해결할 수 있었으며 아래에 해결책을 게시 할 것입니다. 불행히도 정확한 원인을 알지 못하지만 확실한 것들의 조합입니다.

연결 관리자로 매번 DefaultHttpClient를 만드는 대신을 항상 재사용하는 1 DefaultHttpClient 만 만들었습니다. 또한 게시물을 올리거나 얻을 때마다 새로운 HTTPGet/HTTPPost을 기존에서 재사용/재 작성하는 대신 으로 만듭니다.

는 는 내 websiteservice - 클래스

최종 생성자 :

private WebsiteService() 
{ 
    CookieManager.getInstance().setAcceptCookie(true); 
    httpclient = new DefaultHttpClient(); 
    ClientConnectionManager mgr = httpclient.getConnectionManager(); 
    HttpParams params = httpclient.getParams(); 
    manager = new ThreadSafeClientConnManager(params,mgr.getSchemeRegistry()); 
    localContext = new BasicHttpContext(); 
    cookies = new BasicCookieStore(); 
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookies); 
} 

간단한 'GetPage'전화는 이제 다음과 같습니다

httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY); 

     if(cookies != null) 
      httpClient.setCookieStore(cookies); 

     HttpGet httpGet = new HttpGet(url); 

     try { 
      client.response = httpClient.execute(httpGet,localContext); 
     } catch (ClientProtocolException e) { 
      System.out.println("HTTPService : ClientProtocolException : "+e.getMessage()); 
      return null; 
     } catch (IOException e) { 
      System.out.println("HTTPService : IOException : "+e); 
      return null; 
     } 

나는 100 % 확실하지 않다,하지만 난 내가 할 수있는 생각 심지어 setCookies 비트를 생략하십시오. 쿠키는 내 상황에서 개인이 선언 한 CookieStore로, 게시물을 채운 것입니다.

성가신 마지막 부분은 회전 할 때 활동을 다시 생성한다는 것입니다. 이를 해결하기 위해 'Application'을 확장 한 클래스를 확장했습니다. 이 수업에서는 객체 목록을 작성합니다. 내 'OnCreate'에서는 개체 목록이 존재하는지 확인한 다음 가능한 경우 해당 목록을 사용합니다. 로그 오프하거나 새로 고침하면 해당 목록이 다시 생성됩니다. 트릭은 단지 이러한 몇 줄이었다 (내가 추가 조각을 남겨 클래스 '응용 프로그램 확장') :

if(((ApplicationInstance)getApplication()).getProfile() == null) 
     this.initProfileItems(); 
    else 
    { 
     this.ProfileItems =((ApplicationInstance)getApplication()).getProfile(); 
     this.initListView(); 
    } 

된 ApplicationInstance이 응용 프로그램을 확장 내 클래스입니다. 내 'initList'는 객체를 처리합니다. 내 initProfileItems는 실제 데이터를 얻습니다 :-)

희망 나는 두통을 저장했습니다. :) 그리고 시간 내 주셔서 감사합니다. @androidnoob!

+0

문제의 근원은 주로 DefaultHttpClient의 생성 때문입니다. 아직도 이것의 안에서 확실하지 않지만 매우 흥미있다. 다행히 해결책을 찾았습니다! – androidnoob

+0

나는 당신이 절대적으로 맞는 것 같아요 androidnoob! 결국 회전 문제와 관련하여 몇 가지 문제가있었습니다. 나는 스레드와 정보를 인터넷 (주로 스택 오버 플로우;)에서 이것을 해결했다. – Honnes

+0

오리엔테이션이 바뀔 때마다 기본적으로 활동이 다시로드되기 때문에 스크린 오리엔테이션은 HTTP를 다룰 때주의해야 할 사항 중 하나입니다. 그래서 메모 해두면 모든 것이 잘 될 것입니다. =) – androidnoob