我项目中的第二个Activity开始很慢,我不知道如何修复它。它是如何工作的(onCreate()中的所有东西):首先它用json获取请求到页面:
try {
DefaultHttpClient hc = new DefaultHttpClient();
ResponseHandler<String> res = new BasicResponseHandler();
HttpGet getMethod = new HttpGet(url);
String response = hc.execute(getMethod, res);
resStr = response.toString();
} catch (Exception e) {
System.out.println("Exp=" + e);
}
我知道这里的一些方法已被弃用,但我不知道如何使其更加优化。因此,它返回一个包含大约32个对象的JSON数组的字符串。 然后我填充6个数组将它们传递给ArrayAdapter以填充ListView。获取不同类型数据的方法如下所示:
public static String GetWantedType(String resStr, int num) {
String jsonvalues = "";
try {
JSONArray json_Array = new JSONArray(resStr);
JSONObject json_data = json_Array.getJSONObject(num);
jsonvalues = json_data.getString("wanted_type");
} catch (JSONException e) {
e.printStackTrace();
}
return jsonvalues;
}
也许我应该在填充数组之外创建一次json_Array并将其作为JSONArray传递给那些方法,而不是作为字符串传递 - 我不知道它是否会影响速度。 在ArrayAdapter中,一切似乎都没问题,我正在使用ViewHolder,我的滚动非常棒。与开始活动不同。
如何让它更好,更优化?
答案 0 :(得分:1)
首先,不要在onCreate()
中执行所有操作,而是选择onResume()
其次,所有服务器调用都应该在后台线程中使用Async并使用result来显示用户。
如果您不希望在onResume()
和onPause()
期间多次调用API数据,则可以使用数组或其他内容的数据结果,并且在onResume()
调用时,您可以检查它是否有数据,只需加载它,否则从服务器获取。
答案 1 :(得分:1)
正如Gaurav所说,问题是在主线程上调用了网络请求。 当您询问网络电话时,您的程序会说:OK STOP我等待响应。 所以如果你想改变它,你可以做各种各样的事情。 例如,您可以使用带有lib的异步网络调用(loopj lib) 或者你可以简单地打开一个线程:进行网络呼叫。
这样你的UI就不会冻结
答案 2 :(得分:0)
你在主线程上进行网络呼叫吗?请不要这样做。而是在不同的线程上进行网络操作。
对于网络,您可以使用库retrofit。 通过使用回调或使用RxJava中的Observables,它还可以让您轻松地异步执行操作