GVKun编程网logo

如何使用Android HttpRequest在Android onPause中保存状态

10

本文将为您提供关于如何使用AndroidHttpRequest在AndroidonPause中保存状态的详细介绍,同时,我们还将为您提供关于AndroidMVP-分离视图(onPauseVSonDes

本文将为您提供关于如何使用Android HttpRequest在Android onPause中保存状态的详细介绍,同时,我们还将为您提供关于Android MVP-分离视图(onPause VS onDestroy)和状态保存、Android studio在Android 6.0下继续使用Apache HttpClient、android – Http Get Request返回html?、android – Http Put Request的实用信息。

本文目录一览:

如何使用Android HttpRequest在Android onPause中保存状态

如何使用Android HttpRequest在Android onPause中保存状态

我对Android生命周期模型的理解是,在调用onPause()时,我应该保存所有需要保存的状态,因为我的应用可以在返回后的任何时候终止.我的目标是姜饼,因此可能永远不会调用onStop.

但是在我的应用程序中,某些状态正在保存在远程服务器上.我会定期刷新此状态,但是如果调用了onPause,我不确定该怎么做,因为我的理解是,一旦onPause返回,我的应用程序可能会被杀死.由于我必须在另一个线程中运行android http请求,因此这似乎是有问题的:如果我在onPause中启动该请求然后返回,那么在保存状态的远程请求完成(甚至开始!)之前,我的应用可能会被杀死.

我在想应该将某种同步方式放在我睡觉的地方,然后等待请求正常工作,但是首先,我不确定我是否可以在onPause中完成此操作,其次,onPause不应花很长时间要完成此操作,因此,如果存在网络延迟,这也会引起问题.

当状态需要刷新到远程服务器时,或者通常通过某种需要单独线程的方法,是否存在一些建议的将状态保存在onPause中的方法?

解决方法:

需要将状态刷新到远程服务器时,建议在onPause中保存状态的方法:

在OnPause中启动服务(Android服务),然后从该服务将状态刷新到服务器,然后在完成所需任务后关闭该服务.

Android MVP-分离视图(onPause VS onDestroy)和状态保存

Android MVP-分离视图(onPause VS onDestroy)和状态保存

我正在尝试在我的应用程序中实现MVP架构.

但是,在阅读了一些博客并查看了一些示例项目示例之后,我不确定我是否完全了解分离视图的正确位置以及在异步操作后第二次附加视图后应该怎么做.

我看到的大多数示例都只是在异步调用后对视图的null验证检查进行了总结.

我将通过一个示例来阐明我的观点-通过电话号码登录/注册(主要思想是重要,而不是示例本身)

有一个显示片段的活动-LoginFragment.
用户输入他的电话号码并尝试登录.
如果用户退出-他应该导航到另一个活动(输入短信收到的代码后.)
如果用户没有退出,则应导航到注册过程-RegistrationFragment.
如果出现错误,则会出现一个带有错误消息的对话框,ErrorDialogFragment.

现在,用户按下登录按钮并等待该过程完成,一切顺利.

但是,在不那么开心的流程中(不是那么频繁,但绝对不能忽略),用户按下登录按钮,然后按下主页按钮,或者接听电话.

在方案1中,我们在onCreate / onDestroy中附加/分离视图,一旦异步登录操作完成,我们应该替换为RegistrationFragment或显示ErrorDialogFragment,就有机会遇到著名的IllegalStateException:
getting exception “IllegalStateException: Can not perform this action after onSaveInstanceState”

在方案2中,我们在onResume / onPause中附加/分离视图,一旦异步登录操作完成,由于视图已分离,我们将无法替换片段或显示对话框.

在这种情况下,我不确定该怎么做.
我们是否应该采用场景1并使用commitallowingstateloss提交事务?
恐怕这是个坏主意.

还是我们应该使用场景2.在这种情况下,当再次附加视图时,我们应该采取相应的措施,这意味着将状态(RegistrationRequied,ErrorHasOccured,LoginProcessstillRunning等)保存在Presenter / Interactor中.

有人可以对此有所启示吗?

提前致谢!

解决方法:

哦,Android生命周期的乐趣.我感到你很痛苦.

以我的个人经验,诉诸commitAllowingStateLoss通常是在后台更新Ui(视图)的症状(如您所述,UI可能会被破坏).

我的建议是,您不要在未检查活动是否已后台的情况下尝试更新ui(视情况而定,onStop或onPause).如果您的用户界面已经有背景,请记住您需要进行的更改,并在重新连接您的用户界面时进行(根据情况,选择onStart或onResume).

本质上,我是说您应该遵循方案2.是的.您将不得不以某种方式保存很多状态.

不幸的是,这并不容易,从使用事件总线一直到使用RxJava,有很多方法可以做到这一点.
每种方法都有其优点和缺点,它们实在太复杂了,无法在单个文章中进行详细讨论.

但是,我有一段博客文章是我前一段时间写的,它不需要额外的库就可以做到这一点.

现在有点过时了,但可能会给您一些想法:A Simple MVP aproach for Android

祝一切顺利.

亲切的问候,
克里斯.

Android studio在Android 6.0下继续使用Apache HttpClient

Android studio在Android 6.0下继续使用Apache HttpClient

在android 6.0(API 23)中,Google已经移除了移除了Apache HttpClient相关的类

推荐使用HttpUrlConnection,如果要继续使用需要Apache HttpClient,需要在Android studio下libs里添加org.apache.http.legacy.jar,android studio里在相应的module下的build.gradle中加入:

android {
    useLibrary ''org.apache.http.legacy''
}

上面的jar包在:**\android-sdk-windows\platforms\android-23\optional下(需要下载android 6.0的SDK)


android – Http Get Request返回html?

android – Http Get Request返回html?

我正在使用http get Request在 android中加载数据.不知道它返回html而不是 JSON结果.在浏览器中加载时,相同的URL获取json,但响应来自html.

我的Http Get call格式就像这样……

url = new URL(urlString);

        //httpURLConnection = (HttpsURLConnection) url.openConnection();
        httpURLConnection = (HttpURLConnection) url.openConnection();

        httpURLConnection.setRequestMethod("GET");
        httpURLConnection.setRequestProperty("Connection","keep-alive");

        httpURLConnection.setRequestProperty("Accept","application/json"); // or application/jsonrequest
        httpURLConnection.setRequestProperty("Content-Type","application/json");
        /*
        httpURLConnection.setRequestProperty("Content-Type","application/json");*/
        httpURLConnection.setRequestProperty("UseCookieContainer","True");
        httpURLConnection.setRequestProperty("Cookie",cokieValue);
        httpURLConnection.connect();

解决方法

一旦检查了服务器端代码..
即将到来意味着改变这样的代码……

url = new URL(urlString);

        httpURLConnection = (HttpsURLConnection) url.openConnection();
        //httpURLConnection = (HttpURLConnection) url.openConnection();
    //  HttpsURLConnection.setDefaultHostnameVerifier(new NullHostNameVerifier());
        httpURLConnection.setRequestMethod("GET");
        httpURLConnection.setRequestProperty("Connection","keep-alive");
        httpURLConnection.setRequestProperty("Content-Type","application/json");
        httpURLConnection.setRequestProperty("UseCookieContainer","True");
        httpURLConnection.setChunkedStreamingMode(0);
        httpURLConnection.connect();

        if (httpURLConnection != null) {
            respCode = httpURLConnection.getResponseCode();
            messageStatus.setResponseCode(respCode);
        }
        if (respCode == 200) {
            InputStream responseStream = httpURLConnection.getInputStream();
            messageStatus.setResponseStream(responseStream);
        }

android – Http Put Request

android – Http Put Request

我正在使用HttpPut与Android中的服务器通信,我得到的响应代码是500.在与服务器人交谈后,他说准备下面的字符串并发送.

{ “键”: “值”, “关键”: “值”}

现在我完全感到困惑,我应该在我的请求中添加此字符串.

请帮帮我.

解决方法:

我最近不得不想办法让我的Android应用程序与WCF服务进行通信并更新特定记录.起初这真的让我很难搞清楚,主要是因为我对HTTP协议不够了解,但我能够通过使用以下内容创建一个PUT:

    URL url = new URL("http://(...your service...).svc/(...your table name...)(...ID of record trying to update...)");

    //--This code works for updating a record from the Feed--
    HttpPut httpPut = new HttpPut(url.toString());
    JSONStringer json = new JSONStringer()
    .object() 
       .key("your tables column name...").value("...updated value...")
    .endobject();

    StringEntity entity = new StringEntity(json.toString());
    entity.setContentType("application/json;charset=UTF-8");//text/plain;charset=UTF-8
    entity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"application/json;charset=UTF-8"));
    httpPut.setEntity(entity); 

    // Send request to WCF service 
    DefaultHttpClient httpClient = new DefaultHttpClient();

    HttpResponse response = httpClient.execute(httpPut);                     
    httpentity entity1 = response.getEntity(); 

    if(entity1 != null&&(response.getStatusLine().getStatusCode()==201||response.getStatusLine().getStatusCode()==200))
    {
         //--just so that you can view the response, this is optional--
         int sc = response.getStatusLine().getStatusCode();
         String sl = response.getStatusLine().getReasonPhrase();
    }
    else
    {
         int sc = response.getStatusLine().getStatusCode();
         String sl = response.getStatusLine().getReasonPhrase();
    }

有了这个说法有一个更容易的选择,通过使用一个库,将为您生成更新方法,允许您更新记录,而无需像我上面那样手动编写代码.看起来很常见的2个库是odata4j和restlet.虽然我还没有找到一个明确的odata4j简易教程,但有一个非常好的restlet:http://weblogs.asp.net/uruit/archive/2011/09/13/accessing-odata-from-android-using-restlet.aspx?CommentPosted=true#commentmessage

今天关于如何使用Android HttpRequest在Android onPause中保存状态的讲解已经结束,谢谢您的阅读,如果想了解更多关于Android MVP-分离视图(onPause VS onDestroy)和状态保存、Android studio在Android 6.0下继续使用Apache HttpClient、android – Http Get Request返回html?、android – Http Put Request的相关知识,请在本站搜索。

本文标签: