使用AsyncTask加载Viewpager的数据时冻结

时间:2013-04-13 16:40:52

标签: android android-asynctask android-fragments android-viewpager adapter

在我的代码中,我有一个带有按钮的活动,该按钮使用viewpager调用另一个活动,其中包含三个片段。

//...
ViewPager pager = (ViewPager) findViewById(R.id.pager);

ViewPagerAdapter adapterViewPager = new ViewPagerAdapter(getSupportFragmentManager());
        adapterViewPager.addFragment(new FragmentOne());
        adapterViewPager.addFragment(new FragmentTwo());
        adapterViewPager.addFragment(new FragmentThree());

        pager.setOffscreenPageLimit(4);
        pager.setAdapter(adapterViewPager);

//..

在页面/片段上,有一个listview从Internet上加载数据(图像和文本),使用AsyncTask加载这些数据

public class FragmentOne extends Fragment{

//...
    public class loadEntries extends AsyncTask<String, Void, String>{

        //...

        public String doInBackground(String... urls){
            String url = urls[0];

            try {
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                xml = EntityUtils.toString(httpEntity);

            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return xml;
        }

        public void onPostExecute(String xml){
            try{
                entrieList = new ArrayList<HashMap<String, String>>();

                Document doc = getDomElement(xml); 

                NodeList nl = doc.getElementsByTagName(KEY_ENTRIE);

                for (int i = 0; i < nl.getLength(); i++) {

                    HashMap<String, String> map = new HashMap<String, String>();
                    Element e = (Element) nl.item(i);

                    map.put(KEY_ID_ENTRIE, getValue(e, KEY_ID_ENTRIE));
                    map.put(KEY_IMAGE_ENTRIE,getValue(e, KEY_IMAGE_ENTRIE));
                    map.put(KEY_TEXT_ENTRIE, getValue(e, KEY_TEXT_ENTRIE));

                    entrieList.add(map);
                }
                theListViewAdapter();

            } catch (Exception e) {
                // Exception
            }
        }
    }
//...

在每个ListView适配器中,我用来加速ViewHolder进程:

//...
  public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        View vi=convertView;
        if(convertView==null)
            vi = inflater.inflate(R.layout.row_gallery_web, null);
        holder = new ViewHolder();
        holder.text_one = (TextView)vi.findViewById(R.id.titleImageItemGalleryWeb); 
        holder.image_row=(ImageView)vi.findViewById(R.id.imageItemGalleryWeb);

        HashMap<String, String> items = new HashMap<String, String>();
        items = data.get(position);

        try { 
            String textentrie = new String(items.get(FRG_gallery_web.KEY_TITLE_IMAGE).getBytes("ISO-8859-1"));
            holder.text_one.setText(android.text.Html.fromHtml(textentrie));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();}

        imageLoader.DisplayImage(items.get(FRG_gallery_web.KEY_URL_IMAGE), holder.image_row);
        return vi;
    }

这是我的问题:

当我按下调用包含viewpager的活动的按钮时,一切都会在加载片段时冻结。后台进程正常工作,因为我可以正确读取日志。 为了更好地解释它,如果我按下调用包含viewpager的活动的按钮,在屏幕上显示一个进度条,这也会冻结。

我正在从其他线程中加载来自互联网的数据,而不是每个片段的主体。

充电时冻结的原因是什么?

我感谢任何帮助。

谢谢。此致

0 个答案:

没有答案