2012-03-07 4 views
0

Я боролся с Android в течение последних нескольких недель и получил первое приложение для работы ... на моем эмуляторе только, к сожалению. Я действительно надеюсь, что кто-то может помочь мне, чтобы он работал на моем устройстве Android. Эмулятор запускает v2.2, мои устройства 2.3+.Приложение для Android HTTP, работающее на эмуляторе, а не на моем телефоне

У меня есть singleton 'websiteervice'-класс, созданный классом, который расширяет «Приложение». Класс websiteservice создает 1 threadafeconnection-manager и содержит «CookieStore». Каждый HTTPGet/Post создает новый HTTPClient, к которому привязан threadafeconn.manager. Каждый раз, когда я делаю сообщение или получаю, я пытаюсь прикрепить файлы cookie, если они доступны. Файлы cookie устанавливаются один раз и устанавливаются только при входе в защищенную часть веб-сайта. Вместе с EntitityUtils.ToString и Jsoup я анализирую каждый результат HTML моей «защищенной» части сайта. При входе в систему я создаю таблицу sqllite в android, в которой храню только одну простую запись, пользователя, который вошел в систему.

Когда я запускаю это на своем эмуляторе, все работает так, как я бы хотел, но на моем устройстве что-то кажется ужасно неправильным. Я подключил отладчик к своему телефону. Запись в журнал, похоже, идет очень хорошо, и файлы cookie устанавливаются. Квадратный бит, вероятно, тоже прекрасен, поскольку я, похоже, не получаю ошибок. После загрузки страницы профиля я вижу, что HTTPGet-action получает файлы cookie, прикрепленные к CookieStore, но полученный HTML-результат/документ - 95% от времени входа в систему.

Я говорю 95%, потому что я попал на мою страницу профиля один или два раза на своем ухоженном Desire HD, но на другом Desire HD я этого не сделал, и на моем Sensation XE тоже. Время, которое я получил, загрузило страницу профиля (пользовательский список с хэшмапом в качестве ввода), я не мог начать никаких действий. Они сразу же прервались, и, вероятно, у них была одна и та же проблема (в результате был получен логин-страница).

Есть ли какие-либо разрешения, которые я забыл, есть ли что-нибудь, что я должен проверить, или вы знаете, что это может быть? Я действительно запутался прямо сейчас.

Небольшое обновление
Я только что перезагрузил свой телефон. Когда я запускаю программу, при первом входе в систему моя страница профиля загружается. Мое «подробное» действие, похоже, работает. Это действие не подключается к Интернету или так, оно просто отображает информацию, хранящуюся в классе. Мои другие 2 действия (копирование и удаление) не работают (я, вероятно, получу «страницу входа»). Когда я поворачиваю экран (изменения ориентации), страница «перезагружается», и она пытается снова загрузить страницу профиля. Список удаляется, и я не возвращаю страницу своего профиля (это список рекламных объявлений).

Обновление 2 - 08-03 В файле манифеста содержится только разрешение на доступ к Интернету, кроме регистрации моих действий. Маленький «странный» дополнительный. Кажется, мой «резервный» код почти равен моему коду, размещенному здесь. Каждый раз, когда он, похоже, прикрепляет мои файлы cookie, но все же он ничего не делает с этим :(Кроме того, я немного играл вчера с моим телефоном, я несколько раз менял оговорку (которая автоматически перезагружает активность) и вдруг у меня один или два раза был мой профиль впереди. Я не мог делать никаких действий, но мой класс, содержащий информацию, был доступен и заполнен. PS. Сейчас, в 8.15 утра, я снова могу загрузить свой профиль после переключения ориентация в 4-5 раз.

Update 08.03.2012 Я озадачивает и пробовал много вещей, в вечернее время, и теперь я даже получил мой эмулятор-версии обратно на площадь 1. у вас есть резервная копия, поэтому np, но я думаю, что я не использую свой http-клиент должным образом. Я удалил весь предыдущий код, вот мой текущий код, который я использую для своего «веб-сервиса», и мой «Webclient», который я создаю для каждого получения/сообщения, просто присоединяясь к диспетчеру связи.

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:

public DefaultHttpClient httpClient; 
public HttpResponse response = null; 

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

я должен делать что-то неправильно с печеньем, или не должны использовать тот же HttpGet/HttpPost или так. Надеюсь, завтра я смогу решить это с ясным умом.

Идеи и ввод приветствуются!

+0

Мы могли бы лучше рассмотреть, если вы разместили свой код. Скорее домой =) – androidnoob

+0

Я сделаю это, когда смогу. Я только начал свой рабочий день, но я просто почувствовал желание отправить свой вопрос, так что через 7-8 часов я смогу обновить свой вопрос. У меня такое чувство, что я могу пропустить какое-то управление контекстом или что-то еще. Поскольку я никогда раньше этого не делал, я «захватывал» информацию из всех видов потоков, в результате чего я получил сейчас :) – 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, который я заполняю после публикации.

Последняя часть, которая раздражала, заключается в том, что при вращении она воссоздает активность. Чтобы решить эту проблему, я расширил класс, который расширяет «Приложение». В этом классе я помещаю список моих объектов. В моем «OnCreate» я проверяю, существует ли список объектов, и используйте этот список, если он доступен. При выходе из системы или обновлении я воссоздаю этот список. Трюк был только эти несколько строк: (я ушел из куска я добавил в «расширяет класс Application»):

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

ApplicationInstance мой класс, который расширяет приложение. Мой «initList» обрабатывает объекты. Мой initProfileItems делает фактические данные:: 0:

Надеюсь, что я спас кого-то головную боль :), и спасибо за ваше время, @androidnoob!

+0

Я полагаю, что корень проблемы во многом обусловлен созданием DefaultHttpClient. Тем не менее, это не так, но очень интересно. Рад, что вы нашли решение! – androidnoob

+0

Я думаю, что ты абсолютно прав андроинооб! В конце концов, у меня все еще были проблемы с ротацией. Я решил это с помощью потоков и информации из Интернета (в основном, переполнение стека;)). – Honnes

+0

Ориентация экрана - это одна из вещей, которую вы должны учитывать при работе с HTTP, потому что активность перезагружается по умолчанию при каждом изменении ориентации. Так что обратите внимание на это, и все будет хорошо =) – androidnoob

Смежные вопросы