0

我的应用程序有问题。一开始我将描述它是如何工作的。它向服务器发送请求(不是我创建的),在响应中我得到 JSON 字符串(JSONarray 中平均 10 条记录不是那么大),在一个参数中有一个指向我下载的图片的 URL 和保存为每个 JSON 对象的位图。总结一下,我下载了一个 JSON,它看起来像:

{
    "id":"125", 
    "description":"desc",   
    "type":"type",  
    "state":"state",    
    "date":"2012-09-22 10:40:46.0",
    "lat":"52.321911",
    "lng":"19.464111",
    "author":"user",
    "photo":"GetImage?size=small&id=0",
    "comments":[

    ]
    }

例如 x 10,然后我从 URL 下载每个对象的“照片”图像。问题在于执行的时间,真的很长,不应该不是大数据。这是我这样做的方法: 下载图像的 AsyncClass:

private class HttpGetImage extends AsyncTask<Object, Integer, Integer>
    {
        public boolean ready = false;
        public boolean success = false;

        @Override
        protected Integer doInBackground(Object... obj) {
            DefaultHttpClient client = new MyHttpClient(ViewEdit.this);

            HttpGet get = new HttpGet(url+photoUrl);
            HttpResponse getResponse = null;
            try {
                getResponse = client.execute(get);
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                ready=true; return null;

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                ready=true; return null;

            }

            HttpEntity responseEntity = getResponse.getEntity();
            BufferedHttpEntity httpEntity = null;
            try {
                httpEntity = new BufferedHttpEntity(responseEntity);
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
                ready=true; return null;

            }
            InputStream imageStream = null;
            try {
                imageStream = httpEntity.getContent();
                m_orders.get((Integer)obj[1])
                    .setOrderBitmap(BitmapFactory.decodeStream(imageStream));

                success = true;
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                ready=true; return null;

            } finally {
                try {
                    imageStream.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    ready=true; return null;

                }
            }

            ready = true;
            return null;
        }
    }

和 jsonString 的 AsyncClass:

private class HttpGetNotifications extends AsyncTask<Double, Integer, Integer>
    {
        public boolean ready = false;
        public boolean success = false;

        @Override
        protected Integer doInBackground(Double... params) 
        {
            DefaultHttpClient client = new MyHttpClient(ViewEdit.this);
            HttpGet get = new HttpGet(url + Double.toString(params[0]) + "&longitude=" + Double.toString(params[1]) + "&radius="+distance);

            HttpResponse getResponse = null;
            try {
                getResponse = client.execute(get);

            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                ready=true; return null;
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                ready=true; return null;
            }
            HttpEntity responseEntity = getResponse.getEntity();
            String entityContents="";
            try {
                entityContents = EntityUtils.toString(responseEntity);

                loadNotifications(entityContents);
                success = true;
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                ready=true; return null;

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                ready=true; return null;

            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                ready=true; return null;

            }

            ready = true;
            return null;
        }

        public void loadNotifications(String jsonstring) throws JSONException
        {
            JSONObject jsonResponse = new JSONObject(jsonstring);

            JSONArray notifi = jsonResponse.getJSONArray("notifications");
            for (int i =0, count = notifi.length(); i <count; i++){
                //storage of data
            }       
        }
    }

也许你们知道如何优化该代码以减少执行时间?

4

1 回答 1

0

进行一些分析以查找需要时间的内容。在您的每个 AsyncTask 中:

private long time0, time1;
@Override protected void onPreExecute() {
    time0 = System.currentTimeMillis();
}
@Override protected void onPostExecute(HttpResponse response) {
    time1 = System.currentTimeMillis();
long deltaT = (time1 - time0);
Log.d(TAG, "Execute took "+deltaT+"ms");
}

然后从那里去。

于 2012-11-14T22:21:39.220 回答