From 82c0208ac85ad2f695adb9805dbdcd3e6906e76b Mon Sep 17 00:00:00 2001 From: seven332 Date: Sat, 6 Sep 2014 03:37:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20EH=20=E7=AB=99=E7=82=B9?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E6=9C=80=E5=B0=8F=E9=97=B4=E9=9A=94=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- res/values-zh-rCN/strings.xml | 2 ++ res/xml/advanced_settings.xml | 12 ++++++++ .../hippo/ehviewer/network/HttpHelper.java | 28 ++++++++++++++++--- .../hippo/ehviewer/ui/SettingsActivity.java | 14 ++++++++++ src/com/hippo/ehviewer/util/Config.java | 11 ++++++++ 5 files changed, 63 insertions(+), 4 deletions(-) diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index ccdeea306..b115dcc10 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -212,6 +212,8 @@ 连接重试次数 连接超时 (ms) 读取超时 (ms) + EH + EH 站点最小连接间隔 (ms) 关于 作者 diff --git a/res/xml/advanced_settings.xml b/res/xml/advanced_settings.xml index 61026c867..1fd878b3d 100644 --- a/res/xml/advanced_settings.xml +++ b/res/xml/advanced_settings.xml @@ -47,4 +47,16 @@ + + + + + + \ No newline at end of file diff --git a/src/com/hippo/ehviewer/network/HttpHelper.java b/src/com/hippo/ehviewer/network/HttpHelper.java index 952b89789..d4d94ccb3 100644 --- a/src/com/hippo/ehviewer/network/HttpHelper.java +++ b/src/com/hippo/ehviewer/network/HttpHelper.java @@ -68,8 +68,6 @@ import com.hippo.ehviewer.util.Utils; public class HttpHelper { private static final String TAG = HttpHelper.class.getSimpleName(); - private static final int HTTP_RETRY_TIMES = 3; - public static final String SAD_PANDA_ERROR = "Sad Panda"; public static final String HAPPY_PANDA_BODY = "Happy Panda"; @@ -91,7 +89,7 @@ public class HttpHelper { "http://proxyy0005.appsp0t.com/proxy", "http://proxyy0006.appsp0t.com/proxy" }; - private static int sProxyIndex = MathUtils.random(0, PROXY_URLS.length); + private static volatile int sProxyIndex = MathUtils.random(0, PROXY_URLS.length); private static Object sProxyIndexLock = new Object(); public class Package { @@ -109,6 +107,9 @@ public class HttpHelper { private OnRespondListener mListener; private String mPreviewMode; + private volatile long mLastEhConnectTime = 0; + private static final Object ehLock = new Object(); + public interface OnRespondListener { void onSuccess(Object body); void onFailure(String eMsg); @@ -200,6 +201,7 @@ public class HttpHelper { private Object requst(RequestHelper rh) { URL url = null; HttpURLConnection conn = null; + boolean isCookiable = false; for (int times = 0; times < Config.getHttpRetry(); times++) { mException = null; @@ -207,8 +209,24 @@ public class HttpHelper { boolean firstTime = true; try { url = rh.getUrl(); + + isCookiable = isUrlCookiable(url); + + while (isCookiable) { + synchronized(ehLock) { + long cur = System.currentTimeMillis(); + long left = mLastEhConnectTime + Config.getEhMinInterval() - cur; + if (left <= 0) { + mLastEhConnectTime = cur; + break; + } else { + Thread.sleep(left); + } + } + } + + Log.d(TAG, "Requst " + url.toString()); - boolean isCookiable = isUrlCookiable(url); while (redirectionCount++ < Constants.MAX_REDIRECTS) { conn = (HttpURLConnection) url.openConnection(); conn.setInstanceFollowRedirects(false); @@ -245,6 +263,7 @@ public class HttpHelper { AppHandler.getInstance().sendMessage( Message.obtain(null, AppHandler.HTTP_HELPER_TAG, Constants.TRUE, 0, new Package(obj, mListener))); + return obj; // redirect case HttpURLConnection.HTTP_MOVED_PERM: @@ -290,6 +309,7 @@ public class HttpHelper { // Send exception to helper if (mException != null) rh.onGetException(mException); + return null; } diff --git a/src/com/hippo/ehviewer/ui/SettingsActivity.java b/src/com/hippo/ehviewer/ui/SettingsActivity.java index fbc2b49e3..88f9e359e 100644 --- a/src/com/hippo/ehviewer/ui/SettingsActivity.java +++ b/src/com/hippo/ehviewer/ui/SettingsActivity.java @@ -632,10 +632,12 @@ public class SettingsActivity extends AbsPreferenceActivity { private static final String KEY_HTTP_RETRY = "http_retry"; private static final String KEY_HTTP_CONNECT_TIMEOUT = "http_connect_timeout"; private static final String KEY_HTTP_READ_TIMEOUT = "http_read_timeout"; + private static final String KEY_EH_MIN_INTERVAL = "eh_min_interval"; private Preference mHttpRetry; private Preference mHttpConnectTimeout; private Preference mHttpReadTimeout; + private Preference mEhMinInterval; @Override public void onCreate(Bundle savedInstanceState) { @@ -648,6 +650,8 @@ public class SettingsActivity extends AbsPreferenceActivity { mHttpConnectTimeout.setOnPreferenceChangeListener(this); mHttpReadTimeout = findPreference(KEY_HTTP_READ_TIMEOUT); mHttpReadTimeout.setOnPreferenceChangeListener(this); + mEhMinInterval = findPreference(KEY_EH_MIN_INTERVAL); + mEhMinInterval.setOnPreferenceChangeListener(this); } @Override @@ -683,6 +687,16 @@ public class SettingsActivity extends AbsPreferenceActivity { MaterialToast.showToast(R.string.invalid_input); return false; } + } else if (KEY_EH_MIN_INTERVAL.equals(key)) { + String value = (String)newValue; + try { + int num = Integer.parseInt(value); + if (num < 0) + throw new Throwable(); + } catch(Throwable e){ + MaterialToast.showToast(R.string.invalid_input); + return false; + } } return true; diff --git a/src/com/hippo/ehviewer/util/Config.java b/src/com/hippo/ehviewer/util/Config.java index d5a0e4230..788f21b6f 100644 --- a/src/com/hippo/ehviewer/util/Config.java +++ b/src/com/hippo/ehviewer/util/Config.java @@ -560,6 +560,9 @@ public class Config { private static final String KEY_HTTP_READ_TIMEOUT = "http_read_timeout"; private static final String DEFAULT_HTTP_READ_TIMEOUT = "5000"; + private static final String KEY_EH_MIN_INTERVAL = "eh_min_interval"; + private static final String DEFAULT_EH_MIN_INTERVAL = "0"; + public static int getHttpRetry() { try { return Integer.parseInt(mConfigPre.getString(KEY_HTTP_RETRY, DEFAULT_HTTP_RETRY)); @@ -583,4 +586,12 @@ public class Config { return 5000; } } + + public static int getEhMinInterval() { + try { + return Integer.parseInt(mConfigPre.getString(KEY_EH_MIN_INTERVAL, DEFAULT_EH_MIN_INTERVAL)); + } catch(Throwable e){ + return 0; + } + } }