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