-3

興味深い質問があります。リモートサーバーからのデータを含むリストビューをロードすることでUIと対話するAndroidの関数があります。予想通り、これは私のアプリを非常に遅くします。

最小限のコードで、この関数を通常の関数のように実行できるようにしながら、この関数を独自のスレッドまたは同期タスクに配置するにはどうすればよいですか?

それは非常に効率的ではありませんでした。可能な限り最小限のコードでこれを行う必要があります。

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作業はNon-UIスレッドで行うのが常に良い習慣ですが、androidのバージョンの登場により法律になりました。HoneyComb

- Android アプリケーションが専用 UI スレッドで起動したとき。

- UI スレッドで IO やネットワーク呼び出しなどの高価なタスクを実行すると、応答しなくなります。

-そのため、Non-UI スレッドで Networking 呼び出しを行う方が適切です。これには 2 つの方法があります。痛みの少ないスレッディングとそれThreadHandler呼ばれるもの。AsyncTask

このリンクを参照してください。

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

于 2012-11-23T11:06:18.933 に答える