저는 지난 몇 주 동안 안드로이드에 어려움을 겪어 왔고, 나 자신이 첫 번째 작업 응용 프로그램이되었습니다. 나는 정말 누군가가 내 안드로이드 장치 (들)에서 작동하도록 나를 도울 수 있기를 바랍니다. 에뮬레이터는 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);
}
. 바라기를 나는 내일 다시 명확한 마음으로 이것을 해결할 수있을 것이다.
아이디어와 의견을 보내 주시면 감사하겠습니다.
코드를 올리면 더 잘 볼 수 있습니다. 서둘러 집 =) – androidnoob
할 수있을 때 그렇게 할 것입니다. 방금 일을 시작한 지 얼마되지 않았지만, 나는 이미 내 질문을 올릴 충동을 느꼈다. 지금부터 7-8 시간 후에, 내 질문을 업데이트 할 수있을 것이다. 나는 컨텍스트 - 매니지먼트 (context-management) 나 어떤 것을 놓칠 수도있는 그런 느낌을 가지고있다. 내가 전에 그렇게 해본 적이 없기 때문에 모든 종류의 스레드에 대한 정보를 얻었으므로 지금 얻은 결과가되었습니다. – Honnes
코드 게시 주셔서 감사합니다. 매니페스트 XML에 정의한 권한을 추가 할 수 있습니까? – androidnoob