-3

我有一个有趣的问题要问你。我在 Android 中有一个函数,它通过从远程服务器加载带有数据的列表视图来与 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();
    }
4

2 回答 2

1

您可以将用于从远程服务器获取 JSONObject 的代码放在 AsyncTask 类的 doInBackground() 方法中,并从该函数返回该 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
    }
}
于 2012-11-23T08:58:46.243 回答
0

-在 UI 线程中做 UI工作,在 Non-UI 线程上做非 UI 工作总是一个好习惯,但随着android 版本的到来,它变成了一个规律。HoneyComb

-当 Android 应用程序在专用 UI​​ 线程上启动它时。

-在 UI 线程上执行过程昂贵的任务(如 IO、网络调用等)将使其无响应。

-所以最好在非 UI 线程上进行网络调用,这可以通过两种方式完成。Thread使用Handler或我们所说的无痛线程,就是这样AsyncTask

请参阅此链接:

http://www.vogella.com/articles/AndroidPerformance/article.html

于 2012-11-23T11:06:18.933 回答