重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

android超时,android 网络请求超时机制

如何修改android系统的“屏幕超时”

今天修改了android2.3的“屏幕超时”部分,主要是修改了超时时间,添加了“永不休眠”选项。这部分修改只是更改了对应的XML文件,没有涉及到代码修改,大家都知道xml文件的作用,这里就不多说了。需要修改的文件如下:

坡头ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联建站的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18980820575(备注:SSL证书合作)期待与您的合作!

android2.3\packages\apps\Settings\res\values\arrays.xml 中:

!-- Display settings. The delay in inactivity before the screen is turned off. These are shown ain a list dialog. --

string-array name="screen_timeout_entries"

item15 seconds/item

item30 seconds/item

item1 minute/item

item10 minutes/item

item30 minutes/item

itemnever sleep/item

/string-array

!-- Do not translate. --

string-array name="screen_timeout_values" translatable="false"

!-- Do not translate. --

item15000/item

!-- Do not translate. --

item30000/item

!-- Do not translate. --

item60000/item

!-- Do not translate. --

item600000/item

!-- Do not translate. --

item1800000/item

!-- Do not translate. --

item-1/item

/string-array

要是是系统屏幕永不超时也就是将待机时间设为“-1”,这是最关键的一点;

对应英文版本:

android2.3\packages\apps\Settings\res\values-cs\arrays.xml

string-array name="screen_timeout_entries"

item msgid="3342301044271143016""15 sekund"/item

item msgid="8881760709354815449""30 sekund"/item

item msgid="7589406073232279088""1 minuta"/item

item msgid="7001195990902244174""10 minuty"/item

item msgid="5721688686241190620""30 minut"/item

item msgid="7156442995039264948""never sleep."/item

/string-array

对应中文版本:

android\android_gingerbread_skdv210\packages\apps\Settings\res\values-zh-rCN\arrays.xml

string-array name="screen_timeout_entries"

item msgid="3342301044271143016""15 秒"/item

item msgid="8881760709354815449""30 秒"/item

item msgid="7589406073232279088""1 分钟"/item

item msgid="7001195990902244174""10 分钟"/item

item msgid="5721688686241190620""30 分钟"/item

item msgid="7156442995039264948""从不休眠"/item

/string-array

如何设置android HttpPost 连接服务器超时

1.// 根据内容来源地址创建一个Http请求

2.HttpPost request = new HttpPost(SERVER_URL);

3.//设置请求超时

4.int timeoutConnection = 3 * 1000;

5.HttpConnectionParams.setConnectionTimeout(httpParameters,timeoutConnection);

6.//设置响应超时

7.int timeoutSocket = 5 * 1000;

8.HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

9.// 发送请求并获取反馈

10.DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);

11.HttpResponse httpResponse = httpClient.execute(request);

如何在android下采用相对时间,实现超时等待的功能

一、函数功能说明

pthread_cond_timedwait 等待一个条件变量,或者超时就会返回

POSIX有两种时钟类型

1、CLOCK_REALTIME: 系统范围内的实时时钟,是个时钟,可以通过命令等方式修改该系统时间.

2、CLOCK_MONOTONIC:系统起机时到现在的时间,不能被设置和修改.

pthread_cond_timedwait()在没有设置条件变量属性的时候,默认用的是CLOCK_REALTIME时间,

因此在极端情况下会出现实际等待的时间与设置的超时时间不同。

所以,对于linux的超时等待功能,最好是使用CLOCK_MONOTONIC进行实现,并且通过pthread_condattr_setclock实现。

而对于android系统而言,是不支持pthread_condattr_setclock,通过验证可以采用函数pthread_cond_timedwait_monotonic实现。

下面直接给出代码的实现功能。

二、超时等待功能

[cpp] view plain copy

#include stdio.h

#include string.h

#include pthread.h

#include sys/time.h

#include sys/times.h

#include unistd.h

#include time.h

static pthread_mutex_t s_mut = PTHREAD_MUTEX_INITIALIZER;

static pthread_cond_t s_cond = PTHREAD_COND_INITIALIZER;

void PthreadAttr_Init(void);

unsigned long long getSysTime(void);

void waitTimeout(void);

void PthreadAttr_Init(void)

{

#if defined(ANDROID)

#else

pthread_condattr_t cattr;

int iRet = -1;

iRet = pthread_condattr_init(cattr);

if (iRet != 0)

{

return;

}

pthread_mutex_init(s_mut, NULL);

pthread_condattr_setclock(cattr, CLOCK_MONOTONIC);

pthread_cond_init(s_cond, cattr);

pthread_condattr_destroy(cattr);

#endif

return;

}

void waitTimeout(void)

{

unsigned long long ullbefore = getSysTime();

unsigned long long ullafter = 0;

#if defined(ANDROID)

#if defined(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC) // 支持ANDROID下NDK的编译,采用相对时间

struct timespec outtime;

memset(outtime, 0x00, sizeof(struct timespec ));

clock_gettime(CLOCK_MONOTONIC, outtime);

outtime.tv_sec += 2;

pthread_mutex_lock(s_mut);

pthread_cond_timedwait_monotonic(s_cond,s_mut, outtime);

pthread_mutex_unlock(s_mut);

ullafter = getSysTime();

printf("####01 interval[%lld] ms\n", ullafter - ullbefore);

#else //支持ANDROID下NDK的编译,采用绝对时间

struct timeval now;

struct itmespec outtime;

gettimeofday(now, NULL);

outtime.tv_sec = now..tv_sec + 3;

outtime.tv_nsec = now.tv_usec * 1000;

pthread_mutex_lock(s_mut);

pthread_cond_timedwait(s_cond, s_mut, outtime);

pthread_mutex_unlock(s_mut);

ullafter = getSysTime();

printf("####02 interval[%lld] ms\n", ullafter - ullbefore);

#endif

#else // 支持LINUX下的编译,采用绝对时间

struct timespec outtime;

memset(outtime, 0x00, sizeof(struct timespec ));

clock_gettime(CLOCK_MONOTONIC, outtime);

outtime.tv_sec += 4;

pthread_mutex_lock(s_mut);

pthread_cond_timedwait(s_cond, s_mut, outtime);

pthread_mutex_unlock(s_mut);

ullafter = getSysTime();

printf("####03 interval[%lld] ms\n", ullafter - ullbefore);

#endif

return;

}

unsigned long long getSysTime(void)

{

unsigned long long milliseconds = 0;

struct tms t_tmsTime;

clock_t t_CurTime;

static int s_clks_per_sec = 0;

if (s_clks_per_sec == 0)

{

s_clks_per_sec = sysconf(_SC_CLK_TCK);

}

if (s_clks_per_sec == 0)

{

return 0;

}

t_CurTime = times(t_tmsTime);

if (1000 % s_clks_per_sec == 0)

{

milliseconds = (1000 /s_clks_per_sec)*(unsigned long long )t_CurTime;//换算成毫秒

}

else

{

milliseconds = 1000 * (unsigned long long )t_CurTime/s_clks_per_sec;//换算成毫秒

}

return milliseconds;

}

int main(void)

{

PthreadAttr_Init();

waitTimeout();

return 0;

}

编译命令:

gcc test_ptthrad_conf_timewait_monotonic.c -o test_ptthrad_conf_timewait_monotonic -lpthread -lrt

linux下的测试结果:

####03 interval[4010] ms

android中如何获取超时时长的异常

android获取超时时长的异常方式如下:设置超时机制

client.getParams().setIntParameter(

HttpConnectionParams.SO_TIMEOUT, TIME_OUT_DELAY); // 超时设置

client.getParams().setIntParameter(

HttpConnectionParams.CONNECTION_TIMEOUT, TIME_OUT_DELAY);// 连接超时

这里设置了两种超时,第一种是请求超时,第二种时连接超时。

当向服务器发出请求后,请求和服务器建立socket连接,但是很长时间内都没有建立socket连接,这就时第一种请求超时,这种情况主要发生在请求了

一个不存在的服务器。超时之后,会抛出InterruptedIOException异常。

Timeout for blocking operations. The argument value is specified in

milliseconds. An InterruptedIOException is thrown if this timeout

expires.

android okhttp超时怎么办

OkHttp是一个在开发可汗学院AndroidAPP过程中非常重要的依赖库。它的默认的配置为我们提供了非常重要实用功能,下面一些步骤我们可以让Okhttp提供功能使用灵活和内省能力。1.启用文件系统上的响应缓存默认情况下,Okhttp不支持响应缓存,包括HTTPCache-Control头允许缓存响应。因此,客户端通过一次又一次的请求相同的资源浪费时间和带宽。而不是简单地读取初始响应后缓存的副本。要在文件系统中启用响应缓存,需要配置com.squareup.okhttp.Cache实例,并把它传递给你的OkHttpClient实例的setCache方法。你必须初始化缓存与存放目录的文件,并以字节为单位的最大值。响应返回数据可以写入给定目录文件,如果一个响应的缓存超过了给定的大小。我们可以采取LRUpolicy。我们可以在stackoverflow查看JesseWilson的回复。我们可以通过context.getCacheDir()在子目录中缓存我们的响应://Basedirectoryrecommendedby/q/4441849/400717.final@NullableFilebaseDir=context.getCacheDir();if(baseDir!=null){finalFilecacheDir=newFile(baseDir,"HttpResponseCache");okHttpClient.setCache(newCache(cacheDir,HTTP_RESPONSE_DISK_CACHE_MAX_SIZE));}//Basedirectoryrecommendedby/q/4441849/400717.final@NullableFilebaseDir=context.getCacheDir();if(baseDir!=null){finalFilecacheDir=newFile(baseDir,"HttpResponseCache");okHttpClient.setCache(newCache(cacheDir,HTTP_RESPONSE_DISK_CACHE_MAX_SIZE));}在可汗学院的程序中我们指定HTTP_RESPONSE_DISK_CACHE_MAX_SIZEas10*1024*1024,or10MB的大小2.集成StethoStetho是Facebook的一个可爱的库,可以使用Chrome浏览器的Chrome开发人员工具功能来检查你的Android应用程序。Stetho除了允许你检查你的应用程序的SQLite数据库,还可以查看View的层次结构。允许你检查由OkHttp发起的每个请求和响应:这种自省机制是确保服务器返回允许资源缓存的HTTP头是非常有用的,以及验证没有请求时,保证缓存的资源存在。要想使用Stetho,只需添加一个StethoInterceptor实例的网络拦截器列表:okHttpClient.networkInterceptors().add(newStethoInterceptor());okHttpClient.networkInterceptors().add(newStethoInterceptor());然后,运行应用程序,打开浏览器后,输入chrome://inspect。然后你就会看到应用程序的设备和标识符的列表。然后鼠标右键选择inspect打开开发者工具,然后打开新的tab,开始监控OkHttp请求。3.使用Picasso和Retrofit你可能使用过Picasso来加载网络图片,或者使用Retrofit来简化发出请求和解码响应。这些第三方库将隐式地创建自己的OkHttpClient供内部使用,如果你不明确指定一个。Picassoversion2.5.2的OkHttpDownloader类:privatestaticOkHttpClientdefaultOkHttpClient(){OkHttpClientclient=newOkHttpClient();client.setConnectTimeout(Utils.DEFAULT_CONNECT_TIMEOUT_MILLIS,TimeUnit.MILLISECONDS);client.setReadTimeout(Utils.DEFAULT_READ_TIMEOUT_MILLIS,TimeUnit.MILLISECONDS);client.setWriteTimeout(Utils.DEFAULT_WRITE_TIMEOUT_MILLIS,TimeUnit.MILLISECONDS);returnclient;}privatestaticOkHttpClientdefaultOkHttpClient(){OkHttpClientclient=newOkHttpClient();client.setConnectTimeout(Utils.DEFAULT_CONNECT_TIMEOUT_MILLIS,TimeUnit.MILLISECONDS);client.setReadTimeout(Utils.DEFAULT_READ_TIMEOUT_MILLIS,TimeUnit.MILLISECONDS);client.setWriteTimeout(Utils.DEFAULT_WRITE_TIMEOUT_MILLIS,TimeUnit.MILLISECONDS);returnclient;}Retrofit也有类似的工厂方法来创建自己的OkHttpClient。图片一般在应用程序中需要加载的比较大的资源。尽管Picasso自己维护它的LRU机制来缓存图片,在内存中严格执行。如果客户端尝试使用Picasso来加载图片。Picasso会找不到其在内存中缓存图像,然后将委托加载该图片到它的内部OkHttpClient实例。并且默认情况下该实例将始终从服务器加载图片资源。作为defaultOkHttpClient的方法不能与上面提到的文件系统中的响应缓存配置结合起来。指定你自己的OkHttpClient实例允许返回数据从文件系统缓存响应,图片不会从服务器加载。这是非常重要的在程序第一次启动以后。这个时候Picasso的内存缓存是冷的。所以它会频繁的委托OkHttpClient实例去加载图片。这就需要构建配置了您Picasso的OkHttpClient实例,如果你在你的代码中使用Picasso.with(context).load()Picasso.with(context).load()加载图片,你是用的是Picasso的单例模式。这是通过with方法懒汉模式地实例化并配置自己的OkHttpClient。因此,我们必须使我们自己的Picasso实例在单例之前通过wiht方法调用。实现这个,可以简单的将OkHttpClient实例封装在OkHttpDownloader中,然后传递给Picasso.Builder实例的downloader方法。finalPicassopicasso=newPicasso.Builder(context).downloader(newOkHttpDownloader(okHttpClient)).build();//Theclientshouldinjectthisinstancewheneveritisneeded,butreplacethesingleton//instancejustincase.Picasso.setSingletonInstance(picasso);finalPicassopicasso=newPicasso.Builder(context).downloader(newOkHttpDownloader(okHttpClient)).build();//Theclientshouldinjectthisinstancewheneveritisneeded,butreplacethesingleton//instancejustincase.Picasso.setSingletonInstance(picasso);在Retrofit中要使用OkHttpClient实例,需要改造1.9.x的一个RestAdapter,需要将OkHttpClient封装OkClient的实例中。然后把它传递给RestAdapter.Builder实例的setClient方法。restAdapterBuilder.setClient(newOkClient(httpClient));restAdapterBuilder.setClient(newOkClient(httpClient));在Retrofit2.0中只需要简单的将OkHttpClient传递给Retrofit.Builder实例的client方法。在可汗学院的APP中我们通过Dagger依赖注入来确保我们只有一个OkHttpClient的实例。这种方法同样也适用于Picasso和Retrofit我们提供了一个为OkHttpClient实例提供单例模式的注解示例:@Provides@SingletonpublicOkHttpClientokHttpClient(finalContextcontext,){finalOkHttpClientokHttpClient=newOkHttpClient();configureClient(okHttpClient,);returnokHttpClient;}@Provides@SingletonpublicOkHttpClientokHttpClient(finalContextcontext,){finalOkHttpClientokHttpClient=newOkHttpClient();configureClient(okHttpClient,);returnokHttpClient;}OkHttpClient将会通过Dagger的注解创建一个实例提供给我们的Picasso和Retrofit。4.指定一个用户代理拦截器日志文件和分析为我们提供了有用的信息,当客户在每个请求提供详细的User-Agentheader值的时候。默认情况下,Okhttp包含User-Agent值只有在特定的Okhttp版本中。为了指定我们自己的useragent。首先创建拦截器的替换值,我们可以看stackoverflow的建议。publicfinalclassUserAgentInterceptorimplementsInterceptor{privatestaticfinalStringUSER_AGENT_HEADER_NAME="User-Agent";privatefinalStringuserAgentHeaderValue;publicUserAgentInterceptor(StringuserAgentHeaderValue){this.userAgentHeaderValue=Preconditions.checkNotNull(userAgentHeaderValue);}@OverridepublicResponseintercept(Chainchain)throwsIOException{finalRequestoriginalRequest=chain.request();finalRequestrequestWithUserAgent=originalRequest.newBuilder().removeHeader(USER_AGENT_HEADER_NAME).addHeader(USER_AGENT_HEADER_NAME,userAgentHeaderValue).build();returnchain.proceed(requestWithUserAgent);}}publicfinalclassUserAgentInterceptorimplementsInterceptor{privatestaticfinalStringUSER_AGENT_HEADER_NAME="User-Agent";privatefinalStringuserAgentHeaderValue;publicUserAgentInterceptor(StringuserAgentHeaderValue){this.userAgentHeaderValue=Preconditions.checkNotNull(userAgentHeaderValue);}@OverridepublicResponseintercept(Chainchain)throwsIOException{finalRequestoriginalRequest=chain.request();finalRequestrequestWithUserAgent=originalRequest.newBuilder().removeHeader(USER_AGENT_HEADER_NAME).addHeader(USER_AGENT_HEADER_NAME,userAgentHeaderValue).build();returnchain.proceed(requestWithUserAgent);}}为了创建User-Agentheader值人然后传递给UserAgentInterceptor的构造器,使用你得到的任何信息。我们可以使用:android的系统信息可以清晰的传递出这是一台android设备Build.MODEL或者“制造商提供的用户可见最终可见的名称”Build.BRAND或者“消费者可见的品牌与产品/硬件相关信息”Build.VERSION.SDK_INT或者“消费者可见的Android提供的SDK版本号”BuildConfig.APPLICATION_IDBuildConfig.VERSION_NAMEBuildConfig.VERSION_CODE最后三个值由的applicationID,VERSIONCODE和VERSIONNAME的值在我们的Gradlebuild脚本中了解信息可以查看versioningyourapplications和configuringyourapplicationIdwithGradle请注意,如果您的应用程序使用的是WebView,您可以配置使用相同的User-Agentheader值,你可以通过下面方法创建UserAgentInterceptor:WebSettingssettings=webView.getSettings();settings.setUserAgentString(userAgentHeaderValue);WebSettingssettings=webView.getSettings();settings.setUserAgentString(userAgentHeaderValue);5.指定合理的超时2.5.0版本之前,OkHttp请求默认为永不超时。2.5.0版本开始如果建立连接请求超时,如果从连接读取下一个字节或写入的下一个字节到连接,花费超过10秒,就终止。这样做需要更新到2.5.0版本我们就不需要在我们的代码中修改bug。原因很简单是我因为我们第一次使用的时候使用了错误的路径。要覆盖这些默认值,可以分别调用setConnectTimeout,setReadTimeout或setWriteTimeout。需要注意的是Picasso和Retrofit为OkHttpClient实例指定不同的超时值时,默认情况下,Picasso指定:连接超过15秒.读取超过20秒写入超过20秒而Retrofit指定:连接超过15秒.读取超过20秒没有写入超时通过配置Picasso和Retrofit自己的OkHttpClient实例你可以确保所有的请求超时是一致的

如何修改Android超时休眠时间

方法一、调整代码:

Settings.System.putInt(getContentResolver(),android.provider.Settings.System.SCREEN_OFF_TIMEOUT,-1);

权限:uses-permission android:name="android.permission.WRITE_SETTINGS" /

方法二、调整数据库:

android的这些设置都是存放在sql数据库里的,也就是说可以直接通过修改数据库来不让android睡眠。

sqlite3 /data/data/com.android.providers.settings/databases/settings.db

具体sql:

UPDATE system SET value = '-1' WHERE name = 'screen_off_timeout' ;


本文标题:android超时,android 网络请求超时机制
文章网址:http://cqcxhl.cn/article/dsiijpp.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP