我有一个有趣的问题。我在Android中有一个函数,它通过从远程服务器加载listview来与ui交互。正如预期的那样,这使我的应用程序非常缓慢。
使用最少量的代码,如何将此函数放在自己的线程或同步任务上,同时仍然允许它像正常函数一样执行
效率不高。我只需要用尽可能少的代码就可以做到这一点。
try
{ //getjson file
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
HttpResponse responseGet = client.execute(get);
HttpEntity resEntityGet = responseGet.getEntity();
if (resEntityGet != null) {
InputStream instream = resEntityGet.getContent();
BufferedReader str = new BufferedReader(new InputStreamReader(
instream));
String ans = new String("");
build = new String("");
while ((ans = str.readLine()) != null) {
build = build + ans;
}
//parse json file
JSONObject total = new JSONObject(build);
JSONArray prices = null;
if (!total.isNull("title")){
Prices = title.getJSONArray("title"));}
ArrayList<data> newArray = new ArrayList<data>();
for(int i=0;i<Prices.length();i++)
{
JSONObject price = null;
price = Prices.getJSONObject(i);
data name = new data (price.getString("StoreName"),price.getString("price"),price.getString("Link"));
newArray.add(name);
}
stockArr = new data[newArray.size()];
stockArr = newArray.toArray(stockArr);
//add to listview
ListView listView = (ListView) findViewById(R.id.mylist);
listadapter adapter = new listadapter(this,R.layout.listview_item_row, stockArr);
listView.setAdapter(adapter);
}
}
catch(Exception e)
{
Toast.makeText(getApplicationContext(),e.toString(), 10).show();
}
答案 0 :(得分:1)
您可以在AsyncTask类的doInBackground()方法中放置用于从远程服务器获取JSONObject的代码,并从该函数返回该JSONobject。它将进入onPostExecute()方法,您可以在那里解析并将其加载到列表视图中。
private class myasyncclass extends AsyncTask<String, Void, JSONObject>{
@Override
protected JSONObject doInBackground(String... params) {
//Enter code for fetching value from remote server
return yourjsonobj;
}
@Override
protected void onPostExecute(JSONObject result) {
//Enter code for parsing and create list view
}
}
答案 1 :(得分:0)
- 在UI线程中执行 UI工作,以及在非UI线程上执行非UI工作 强>,但是HoneyComb
版本的android的到来,它变成了法律。
- 当Android应用程序在专用UI线程上启动时。
- 在UI线程上执行IO,网络调用等过程中的昂贵任务会使其无法响应。
- 因此,最好在非UI线程上进行网络调用,这可以通过两种方式完成。 Thread
Handler
或我们称之为无痛线程,那就是AsyncTask
。
请参阅此链接:
http://www.vogella.com/articles/AndroidPerformance/article.html