Android HTTP应用程序在模拟器上运行,在我的手机上不正确



在过去的几周里,我一直在与安卓系统作斗争,并为自己提供了第一个可用的应用程序。。。不幸的是,在我的模拟器上。我真的希望有人能帮我在我的安卓设备上工作。Emulator运行v2.2,我的设备2.3+.

我有一个单独的"websiteservice"类,它是由一个扩展"Application"的类创建的。网站服务类创建1个线程安全连接管理器,并包含一个"CookieStore"。每个HTTPGet/Post都会创建一个新的HTTPClient,并附带threadsafeconn.manager。每次我发布或获取时,我都会尝试附加cookie(如果可用)。当登录到网站的安全部分时,cookie是一次性设置的。与EntitityUtils.ToString和Jsoup一起,我解析"安全"网站部分的每个HTML结果。登录时,我在android中创建了一个sqllite表,其中只存储了一个简单的记录,即登录的用户

当我在模拟器上运行这个程序时,一切都会按照我的意愿运行,但在我的设备上,似乎出现了严重的问题。我把调试器连接到手机上。登录似乎很顺利,并且正在设置cookie。sqllite部分可能也很好,因为我似乎没有遇到错误。加载配置文件页面后,我可以看到HTTPGet操作get是cookies Store附带的cookie,但我收到的HTML结果/doc是登录页面的95%。

我说95%,因为我确实在我的根Desire HD上访问过一两次我的个人资料页面,但在另一个Desire HD我没有,在我的Sensation XE上也没有。有几次我加载了个人资料页面(一个带有哈希图作为输入的自定义列表框),我无法启动任何操作。他们马上中止了,可能也遇到了同样的问题(结果是获得了登录页面)。

有没有我忘记的权限,有没有我应该检查的东西,或者你知道可能是什么吗?我现在真的很困惑。

小更新
我刚重启手机。当我启动程序时,第一次登录时,我的个人资料页面就会被加载。我的"细节"行动似乎奏效了。这个操作不连接到互联网,它只是显示我存储在类中的信息。我的另外两个操作(复制和删除)不起作用(我可能因此得到了"登录页面")。当我打开屏幕(方向改变)时,页面"重新启动",并尝试再次加载配置文件页面。列表框被清除,我无法取回我的个人资料页面(即广告列表)。

更新2-08-03我的清单文件只包含互联网许可,除了我的活动注册。一个小的"奇怪"的额外。我的"备份"代码似乎和我在这里发布的代码差不多。每次它似乎都会附加我的cookie,但它仍然对它没有任何作用:(.此外,我昨天玩手机玩了一会儿,我更改了几次食欲(这会自动重新加载活动),突然间,我有一两次把我的个人资料放在了前面。我无法对它执行任何操作,但我的类包含的信息是可访问的,并且已填充。PS。就在早上8点15分,我可以在切换4-5次方向后再次加载我的个人资料。

更新08-03-2012我一直很困惑,晚上尝试了很多东西,现在我甚至把我的模拟器版本恢复到了1。有一个备份,所以np,但我认为我没有正确使用我的http客户端。我删除了以前的所有代码,这是我用于"网站服务"的当前代码,以及我在每次获取/发布时实例化的"Web客户端",只需附加连接管理器。

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;
    }
}

我的网站客户端:

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

我一定是在使用cookie,或者不应该使用相同的Httpget/Httppost。希望明天我能再次清醒地解决这个问题。

感谢您的想法和意见!

我已经解决了这个非常尴尬的问题,并将在下面发布解决方案。不幸的是,我不知道确切的原因,但这肯定是多种因素的结合。

我没有每次使用连接管理器再次创建一个DefaultHttpClient,而是只创建了1个DefaultHttpClient,我一直在重用它。此外,每次发布或获取时,我都会创建一个新的HTTPGet/HTTPost,而不是从现有HTTPGet/HTPPost中重用/重新创建它。

我的网站服务类的最终构造函数:

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部分。在我的情况下,这些cookie是一个私人申报的cookie商店,我在帖子后填写。

最后一个令人讨厌的部分是,在旋转时,它会重现活动。为了解决这个问题,我扩展了扩展"Application"的类。在这节课上,我列出了我的对象列表。在我的"OnCreate"中,我检查对象列表是否存在,如果可用,则使用该列表。注销或刷新后,我会重新创建该列表。诀窍就在于这几行:(我省略了在"扩展应用程序"类中添加的部分):

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

ApplicationInstance是我的类,它扩展了Application。我的"initList"处理对象。我的initProfileItems进行实际数据获取:-)

希望我救了一个头疼的人:),谢谢你抽出时间,@androidnoob!

相关内容

  • 没有找到相关文章

最新更新