我无法得到这个。有一个工作得很好的应用程序。然后我将我的Razr Droid更新为ICS,事情发生了变化。
使用Drupal服务模块运行Drupal服务器。当我通过wifi连接时,一切都很好。但是当我连接超过3g / 4g时,httpclient.execute()方法需要3-4分钟而不是秒。我把以下示例代码放在一起,重新创建了问题。我应该将浏览器连接添加到超过4g的服务器上工作正常..所以我不认为这是一个简单的无线连接问题。
public class DrupalTestActivity extends Activity {
private Context mCtx;
public static long mSESSION_LIFETIME = 200000; // seconds.
final static String URL = "www.myDrupalServer.com";
final static String ENDPOINT = "rest/";
String mResponse = null;
String cookie;
TextView textView;
public class DoLogin extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... params) {
cookie = getCookie(mCtx);
return cookie;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
textView.setText(mResponse);
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.mCtx = this;
setContentView(R.layout.main);
textView = (TextView) findViewById(R.id.textView);
DoLogin task = new DoLogin();
task.execute();
}
protected String getCookie(Context ctx) {
SharedPreferences settings = PreferenceManager
.getDefaultSharedPreferences(mCtx);
Long timestamp = settings.getLong("sessionid_timestamp", 0);
Long currenttime = new Date().getTime() / 100;
String cookie = settings.getString("cookie", null);
if (cookie == null || (currenttime - timestamp) >= mSESSION_LIFETIME) {
JSONObject mUserAccount = UserAccount.getJSONUserAccount(ctx);
userLogin(mUserAccount);
return getCookie(ctx);
} else {
Log.d("COOKIE", cookie);
return cookie;
}
}
public String userLogin(JSONObject mUserAccount) {
String uri = URL + ENDPOINT + "user/login";
HttpPost httppost = new HttpPost(uri);
httppost.setHeader("Content-type", "application/json");
StringEntity se;
try {
HttpClient mHttpClient = new DefaultHttpClient();
HttpParams mHttpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(mHttpParams, 10000);
HttpConnectionParams.setSoTimeout(mHttpParams, 10000);
se = new StringEntity(mUserAccount.toString());
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,
"application/json"));
httppost.setEntity(se);
Log.d("STATUS", "CALLING DRUPAL");
HttpResponse response = mHttpClient.execute(httppost);
Log.d("STATUS", "LOGIN COMPLETE");
mResponse = EntityUtils.toString(response.getEntity());
// save the sessid and session_name
JSONObject obj = new JSONObject(mResponse);
SharedPreferences settings = PreferenceManager
.getDefaultSharedPreferences(mCtx);
SharedPreferences.Editor editor = settings.edit();
editor.putString("cookie", obj.getString("session_name") + "="
+ obj.getString("sessid"));
editor.putLong("sessionid_timestamp",
new Date().getTime() / 100);
editor.commit();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mResponse;
}
}
这是UserAccount课程,但我并不认为它是相关的..
public class UserAccount {
private String USER = "tester";
private String PASSWORD = "passtest";
private static Context mCtx;
public UserAccount(Context Ctx, String Username, String Password) {
mCtx = Ctx;
}
public void save(Context mCtx) {
// TODO This would really work better if we just passed in the Account
// Object
Map<String, String> mMap = new HashMap<String, String>();
mMap.put("username", USER);
mMap.put("password", PASSWORD);
SharedPreferences settings = PreferenceManager
.getDefaultSharedPreferences(mCtx);
SharedPreferences.Editor editor = settings.edit();
Iterator<?> iter = mMap.entrySet().iterator();
while (iter.hasNext()) {
@SuppressWarnings("rawtypes")
Map.Entry mEntry = (Map.Entry) iter.next();
editor.putString(mEntry.getKey().toString(), mEntry.getValue()
.toString());
}
editor.commit();
}
public static JSONObject getJSONUserAccount(Context ctx) {
SharedPreferences accountSettings = PreferenceManager
.getDefaultSharedPreferences(ctx);
String nUsername = accountSettings.getString("username", "tester");
String nPassword = accountSettings.getString("password", "dweeber");
JSONObject JSONUser = new JSONObject();
try {
JSONUser.put("password", nPassword);
JSONUser.put("username", nUsername);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return JSONUser;
}
}
用于wifi连接的LogCat输出。
07-02 16:49:32.812: I/System.out(12001): debugger has settled (1401)
07-02 16:49:33.319: D/dalvikvm(12001): threadid=1: still suspended after undo (sc=1 dc=1)
07-02 16:49:36.921: D/STATUS(12001): CALLING DRUPAL
07-02 16:49:37.749: D/libc(12001): Forward DNS query to netd(h=www.seinetest.com.php5-22.dfw1-1.websitetestlink.com s=^)
07-02 16:49:43.046: D/STATUS(12001): LOGIN COMPLETE
时间是十几秒左右..
LogCat输出3g / 4g
07-02 16:52:36.171: I/System.out(12759): debugger has settled (1362)
07-02 16:52:36.687: D/dalvikvm(12759): threadid=1: still suspended after undo (sc=1 dc=1)
07-02 16:52:46.171: D/STATUS(12759): CALLING DRUPAL
07-02 16:52:47.265: D/libc(12759): Forward DNS query to netd(h=www.seinetest.com.php5-22.dfw1-1.websitetestlink.com s=^)
07-02 16:53:17.569: W/IInputConnectionWrapper(12759): getExtractedText on inactive InputConnection
07-02 16:53:17.593: W/IInputConnectionWrapper(12759): getExtractedText on inactive InputConnection
07-02 16:54:38.593: W/IInputConnectionWrapper(12759): getExtractedText on inactive InputConnection
07-02 16:54:38.616: W/IInputConnectionWrapper(12759): getExtractedText on inactive InputConnection
07-02 16:56:08.921: D/STATUS(12759): LOGIN COMPLETE
登录时间更长!!
显然,getExtractedText是新的东西,但它是一个原因还是结果?我在这里搜索了IInputConnectionWrapper getExtractedText并且有一个问题,有人询问它的意义是什么......它被关闭并标记为一个坏问题。 :(
其他细节是Verizon运营商 服务器托管在Rackspace云服务器上 手机Verizon Droid Razr,Android 4.0.4
我真的很希望我能在这里得到一些指导,或者我的工作月份已经破产。非常感谢任何帮助。
答案 0 :(得分:2)
我认为我终于明白了这一点。我做了一些研究和一些测试 电话Droid Razr,ICS 4.0.4 Verizone无线。
我对我的三台服务器和谷歌进行了调查。我的所有测试服务器都位于同一个云端(RackSpace) 响应时间如下。 谷歌:42毫秒 我的服务器#1 100毫秒 我的服务器#2 96 我的服务器#3 - 没有注册域名的测试服务器运行为www.seinetest.blah.blah.websitetestlink.com。 Rackspace会自动执行此操作,直到向服务器注册域名为止。响应时间为14445毫秒。
所有四个网站的桌面浏览器时间都不起眼。所以问题就在手机里了......还是做到了?
升级到ICS后,响应时间出现了巨大的差异。我确实在上面的链接中发现了一些其他手机在ICS通过代理时遇到问题的数据。我打电话给Rackspace,并向我保证我注册的域名服务器和服务器#3之间的唯一区别,就是DNS指针指向的位置..没有代理!
没有其他的尝试,我注册了一个域名为WALLAH的服务器#3! 来自ICS电话的响应时间与其他具有注册域名的服务器相同..鉴于这一切都发生在ICS升级中,我倾向于认为这是我将报告的ICS错误。
答案 1 :(得分:0)
如果您没有更改任何代码,并且这是在从Gingerbread升级后发生的,您可能真的想考虑在非ICS设备上进行测试。由于Ice Cream Sandwich增加了“高效的网络使用”功能,因此在wifi / 3G / 4G上存在一些非常随机的连接问题。您可以在Google代码(http://code.google.com/p/android/issues/list?can=2&q=3g+ics&colspec=ID+Type+Status+Owner+Summary+Stars&cells=tiles)上看到很多这类问题,而且这里有一些问题:http://androidcommunity.com/signal-issues-arrive-after-android-4-0-4-ice-cream-sandwich-update-20120405/ 无论如何,非常奇怪,但让人联想到我看到一个不相关的设备跳转到ICS的问题。