在android中创建一个异步/线程函数

时间:2012-11-23 08:26:23

标签: java android android-asynctask

我有一个有趣的问题。我在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();
    }

2 个答案:

答案 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