我正在开发一个Android应用程序,我在其中使用AsyncTask从使用JSON的Web服务获取信息,然后将其加载到ListView中.直到这里一切正常.
我使用了一个在onPreExecute()方法中启动的ProgressDialog,并在onPostExecute()方法中被解雇.在运行2.3.3 android版本的模拟器中,所有这些操作最多需要7/8秒.我已经使用运行2.3.6的真实设备进行了测试,该应用程序具有相同的行为.
但是,当我使用运行4.1 android版本的模拟器时,此操作需要65到70秒.当我删除ProgressDialog时,Android 2.3和4.1版本的操作需要7/8秒.我已多次测试所有这些场景.
为什么会这样?我没有4.1 android版本的任何真实设备来测试它所以我想知道这是否是一个模拟器问题?我试图使用正常的进度条圈,而不是ProgressDialog,但同样的事情发生,它只需要在Android 4.1版本中花费太长时间.
任何想法可能是这种奇怪行为的原因? :S
谢谢.
dmon和James McCracken这里是我活动的代码,你可以帮我吗?
public class MainActivity extends Activity {
private TextView tvTitleList;
private ListView lvDataSearch;
private ProgressDialog dialog;
private long timeStart;
private String[] dataSearch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvTitleList = (TextView) findViewById(R.id.tvTitleList);
lvDataSearch = (ListView) findViewById(R.id.lvDataSearch);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main,menu);
return true;
}
public class ProcessUpdateList extends AsyncTaskFeed = readJSON2("http://search.twitter.com/search.json?q=hey");
JSONObject jsonObject = new JSONObject(readTwitterFeed);
JSONArray jsonArray = new JSONArray();
jsonArray.put(jsonObject);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(jsonObject);
JSONObject jsonObject2 = new JSONObject(json);
JSONObject level1 = jsonObject2.getJSONObject("nameValuePairs");
JSONObject level2 = level1.getJSONObject("results");
JSONArray level3 = level2.getJSONArray("values");
dataSearch = new String[level3.length()];
System.out.println(level3.length()+" resultados encontrados.");;
for(int i=0; iFailed to download file");
}
} catch (Exception e) {
return null;
}
return builder.toString();
}
public void updateViewList() {
ArrayAdapter
编辑:跑一些测试
我测试了解析xml文件和布局中的ProgressBar我得到了这个:
解析时间:94785毫秒
所以,我改变了这一点
对此
并获得此解析时间:2642毫秒
注意:我的ProgressBar和ListView位于LinearLayout中,所有解析都在AsyncTask中完成.这一切都在模拟器上.真奇怪……我的猜测是模拟器实际上并没有将线程与UI分开,因此AsyncTask和ProgressBar旋转正在争夺cpu周期,而在实际的手机中它按预期运行,因为它没有被模拟.
编辑:因此,在我的WinXP上观看TaskManager之后,模拟器以7个线程运行开始.我启动我的应用程序,使用AsyncTask.THREAD_POOL_EXECUTOR运行几个AsyncTask,并且在整个过程中线程计数永远不会从7(在任务管理器中)更改.