今天修改了android2.3的“屏幕超時”部分,主要是修改了超時時間,添加了“永不休眠”選項。這部分修改只是更改了對應(yīng)的XML文件,沒有涉及到代碼修改,大家都知道xml文件的作用,這里就不多說了。需要修改的文件如下:
創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),信州企業(yè)網(wǎng)站建設(shè),信州品牌網(wǎng)站建設(shè),網(wǎng)站定制,信州網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,信州網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
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
要是是系統(tǒng)屏幕永不超時也就是將待機時間設(shè)為“-1”,這是最關(guān)鍵的一點;
對應(yīng)英文版本:
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
對應(yīng)中文版本:
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
1.// 根據(jù)內(nèi)容來源地址創(chuàng)建一個Http請求
2.HttpPost request = new HttpPost(SERVER_URL);
3.//設(shè)置請求超時
4.int timeoutConnection = 3 * 1000;
5.HttpConnectionParams.setConnectionTimeout(httpParameters,timeoutConnection);
6.//設(shè)置響應(yīng)超時
7.int timeoutSocket = 5 * 1000;
8.HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
9.// 發(fā)送請求并獲取反饋
10.DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
11.HttpResponse httpResponse = httpClient.execute(request);
方法一、調(diào)整代碼:
Settings.System.putInt(getContentResolver(),android.provider.Settings.System.SCREEN_OFF_TIMEOUT,-1);
權(quán)限:uses-permission android:name="android.permission.WRITE_SETTINGS" /
方法二、調(diào)整數(shù)據(jù)庫:
android的這些設(shè)置都是存放在sql數(shù)據(jù)庫里的,也就是說可以直接通過修改數(shù)據(jù)庫來不讓android睡眠。
sqlite3 /data/data/com.android.providers.settings/databases/settings.db
具體sql:
UPDATE system SET value = '-1' WHERE name = 'screen_off_timeout' ;
一、函數(shù)功能說明
pthread_cond_timedwait 等待一個條件變量,或者超時就會返回
POSIX有兩種時鐘類型
1、CLOCK_REALTIME: 系統(tǒng)范圍內(nèi)的實時時鐘,是個時鐘,可以通過命令等方式修改該系統(tǒng)時間.
2、CLOCK_MONOTONIC:系統(tǒng)起機時到現(xiàn)在的時間,不能被設(shè)置和修改.
pthread_cond_timedwait()在沒有設(shè)置條件變量屬性的時候,默認(rèn)用的是CLOCK_REALTIME時間,
因此在極端情況下會出現(xiàn)實際等待的時間與設(shè)置的超時時間不同。
所以,對于linux的超時等待功能,最好是使用CLOCK_MONOTONIC進(jìn)行實現(xiàn),并且通過pthread_condattr_setclock實現(xiàn)。
而對于android系統(tǒng)而言,是不支持pthread_condattr_setclock,通過驗證可以采用函數(shù)pthread_cond_timedwait_monotonic實現(xiàn)。
下面直接給出代碼的實現(xiàn)功能。
二、超時等待功能
[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下的測試結(jié)果:
####03 interval[4010] ms
android獲取超時時長的異常方式如下:設(shè)置超時機制
client.getParams().setIntParameter(
HttpConnectionParams.SO_TIMEOUT, TIME_OUT_DELAY); // 超時設(shè)置
client.getParams().setIntParameter(
HttpConnectionParams.CONNECTION_TIMEOUT, TIME_OUT_DELAY);// 連接超時
這里設(shè)置了兩種超時,第一種是請求超時,第二種時連接超時。
當(dāng)向服務(wù)器發(fā)出請求后,請求和服務(wù)器建立socket連接,但是很長時間內(nèi)都沒有建立socket連接,這就時第一種請求超時,這種情況主要發(fā)生在請求了
一個不存在的服務(wù)器。超時之后,會拋出InterruptedIOException異常。
Timeout for blocking operations. The argument value is specified in
milliseconds. An InterruptedIOException is thrown if this timeout
expires.
OkHttp是一個在開發(fā)可汗學(xué)院AndroidAPP過程中非常重要的依賴庫。它的默認(rèn)的配置為我們提供了非常重要實用功能,下面一些步驟我們可以讓Okhttp提供功能使用靈活和內(nèi)省能力。1.啟用文件系統(tǒng)上的響應(yīng)緩存默認(rèn)情況下,Okhttp不支持響應(yīng)緩存,包括HTTPCache-Control頭允許緩存響應(yīng)。因此,客戶端通過一次又一次的請求相同的資源浪費時間和帶寬。而不是簡單地讀取初始響應(yīng)后緩存的副本。要在文件系統(tǒng)中啟用響應(yīng)緩存,需要配置com.squareup.okhttp.Cache實例,并把它傳遞給你的OkHttpClient實例的setCache方法。你必須初始化緩存與存放目錄的文件,并以字節(jié)為單位的最大值。響應(yīng)返回數(shù)據(jù)可以寫入給定目錄文件,如果一個響應(yīng)的緩存超過了給定的大小。我們可以采取LRUpolicy。我們可以在stackoverflow查看JesseWilson的回復(fù)。我們可以通過context.getCacheDir()在子目錄中緩存我們的響應(yīng)://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));}在可汗學(xué)院的程序中我們指定HTTP_RESPONSE_DISK_CACHE_MAX_SIZEas10*1024*1024,or10MB的大小2.集成StethoStetho是Facebook的一個可愛的庫,可以使用Chrome瀏覽器的Chrome開發(fā)人員工具功能來檢查你的Android應(yīng)用程序。Stetho除了允許你檢查你的應(yīng)用程序的SQLite數(shù)據(jù)庫,還可以查看View的層次結(jié)構(gòu)。允許你檢查由OkHttp發(fā)起的每個請求和響應(yīng):這種自省機制是確保服務(wù)器返回允許資源緩存的HTTP頭是非常有用的,以及驗證沒有請求時,保證緩存的資源存在。要想使用Stetho,只需添加一個StethoInterceptor實例的網(wǎng)絡(luò)攔截器列表:okHttpClient.networkInterceptors().add(newStethoInterceptor());okHttpClient.networkInterceptors().add(newStethoInterceptor());然后,運行應(yīng)用程序,打開瀏覽器后,輸入chrome://inspect。然后你就會看到應(yīng)用程序的設(shè)備和標(biāo)識符的列表。然后鼠標(biāo)右鍵選擇inspect打開開發(fā)者工具,然后打開新的tab,開始監(jiān)控OkHttp請求。3.使用Picasso和Retrofit你可能使用過Picasso來加載網(wǎng)絡(luò)圖片,或者使用Retrofit來簡化發(fā)出請求和解碼響應(yīng)。這些第三方庫將隱式地創(chuàng)建自己的OkHttpClient供內(nèi)部使用,如果你不明確指定一個。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也有類似的工廠方法來創(chuàng)建自己的OkHttpClient。圖片一般在應(yīng)用程序中需要加載的比較大的資源。盡管Picasso自己維護(hù)它的LRU機制來緩存圖片,在內(nèi)存中嚴(yán)格執(zhí)行。如果客戶端嘗試使用Picasso來加載圖片。Picasso會找不到其在內(nèi)存中緩存圖像,然后將委托加載該圖片到它的內(nèi)部OkHttpClient實例。并且默認(rèn)情況下該實例將始終從服務(wù)器加載圖片資源。作為defaultOkHttpClient的方法不能與上面提到的文件系統(tǒng)中的響應(yīng)緩存配置結(jié)合起來。指定你自己的OkHttpClient實例允許返回數(shù)據(jù)從文件系統(tǒng)緩存響應(yīng),圖片不會從服務(wù)器加載。這是非常重要的在程序第一次啟動以后。這個時候Picasso的內(nèi)存緩存是冷的。所以它會頻繁的委托OkHttpClient實例去加載圖片。這就需要構(gòu)建配置了您Picasso的OkHttpClient實例,如果你在你的代碼中使用Picasso.with(context).load()Picasso.with(context).load()加載圖片,你是用的是Picasso的單例模式。這是通過with方法懶漢模式地實例化并配置自己的OkHttpClient。因此,我們必須使我們自己的Picasso實例在單例之前通過wiht方法調(diào)用。實現(xiàn)這個,可以簡單的將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方法。在可汗學(xué)院的APP中我們通過Dagger依賴注入來確保我們只有一個OkHttpClient的實例。這種方法同樣也適用于Picasso和Retrofit我們提供了一個為OkHttpClient實例提供單例模式的注解示例:@Provides@SingletonpublicOkHttpClientokHttpClient(finalContextcontext,){finalOkHttpClientokHttpClient=newOkHttpClient();configureClient(okHttpClient,);returnokHttpClient;}@Provides@SingletonpublicOkHttpClientokHttpClient(finalContextcontext,){finalOkHttpClientokHttpClient=newOkHttpClient();configureClient(okHttpClient,);returnokHttpClient;}OkHttpClient將會通過Dagger的注解創(chuàng)建一個實例提供給我們的Picasso和Retrofit。4.指定一個用戶代理攔截器日志文件和分析為我們提供了有用的信息,當(dāng)客戶在每個請求提供詳細(xì)的User-Agentheader值的時候。默認(rèn)情況下,Okhttp包含User-Agent值只有在特定的Okhttp版本中。為了指定我們自己的useragent。首先創(chuàng)建攔截器的替換值,我們可以看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);}}為了創(chuàng)建User-Agentheader值人然后傳遞給UserAgentInterceptor的構(gòu)造器,使用你得到的任何信息。我們可以使用:android的系統(tǒng)信息可以清晰的傳遞出這是一臺android設(shè)備Build.MODEL或者“制造商提供的用戶可見最終可見的名稱”Build.BRAND或者“消費者可見的品牌與產(chǎn)品/硬件相關(guān)信息”Build.VERSION.SDK_INT或者“消費者可見的Android提供的SDK版本號”BuildConfig.APPLICATION_IDBuildConfig.VERSION_NAMEBuildConfig.VERSION_CODE最后三個值由的applicationID,VERSIONCODE和VERSIONNAME的值在我們的Gradlebuild腳本中了解信息可以查看versioningyourapplications和configuringyourapplicationIdwithGradle請注意,如果您的應(yīng)用程序使用的是WebView,您可以配置使用相同的User-Agentheader值,你可以通過下面方法創(chuàng)建UserAgentInterceptor:WebSettingssettings=webView.getSettings();settings.setUserAgentString(userAgentHeaderValue);WebSettingssettings=webView.getSettings();settings.setUserAgentString(userAgentHeaderValue);5.指定合理的超時2.5.0版本之前,OkHttp請求默認(rèn)為永不超時。2.5.0版本開始如果建立連接請求超時,如果從連接讀取下一個字節(jié)或?qū)懭氲南乱粋€字節(jié)到連接,花費超過10秒,就終止。這樣做需要更新到2.5.0版本我們就不需要在我們的代碼中修改bug。原因很簡單是我因為我們第一次使用的時候使用了錯誤的路徑。要覆蓋這些默認(rèn)值,可以分別調(diào)用setConnectTimeout,setReadTimeout或setWriteTimeout。需要注意的是Picasso和Retrofit為OkHttpClient實例指定不同的超時值時,默認(rèn)情況下,Picasso指定:連接超過15秒.讀取超過20秒寫入超過20秒而Retrofit指定:連接超過15秒.讀取超過20秒沒有寫入超時通過配置Picasso和Retrofit自己的OkHttpClient實例你可以確保所有的請求超時是一致的
分享名稱:android超時,手機app請求超時
文章源于:http://aaarwkj.com/article20/dsshojo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機、云服務(wù)器、靜態(tài)網(wǎng)站、域名注冊、外貿(mào)建站、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)