2012-02-28 47 views
0

我正在編寫一個應用程序,它具有由活動管理的幾個片段視圖。這些片段基本上是一個帶有一堆圖像的GridView和一個當用戶點擊GridView中的圖像時觸發的細節視圖。如何加速從片段內的GridView到活動監聽器的點擊通知?

這一切都正常工作,除了因爲有很多其他東西從活動到網格片段(我不斷添加東西到網格視圖並立即顯示),它需要幾秒鐘的點擊得到認可。我曾經假設,構建圖像將是一件耗時的事情,而且當我點擊該項目時,應立即將該事件發送給該活動,因爲沒有任何繁重的工作。一旦消息到達活動,該活動將停止更新網格視圖,並致力於構建詳細信息視圖。

這裏的問題是點擊網格視圖中的元素需要幾秒鐘(在較慢的電話上5到10)才能註冊。我需要做些什麼來加快這一行動?

相關GridFragment代碼:

public class GridFragment extends Fragment{ 
... 
public class ImageAdapter extends BaseAdapter { 
    private GridContent gridContent; 
    private Context mContext; 

    ... 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     // ImageView is my private holder class 
     ImageView imageView; 
     imageView = new ImageView(mContext); 
     imageView.setImageBitmap(gridContent.get(position).getThumb()); 

     imageView.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View view) { 
       // This is what I expect to see immediately upon clicking something, 
       // but takes several seconds to show up in logcat 
       if (Constants.DEBUG){ Log.d(TAG, "an item was clicked - " 
        + gridContent.get(position).getId());} 
        //mListener is a listener implemented by my activity 
        // gridContent.get(position) just returns a small object, 
        // it shouldn't be doing much work 
        mListener.onItemSelected(gridContent.get(position)); 
      } 

      }); 

     return imageView; 
    } 
} 
} 

相關活動代碼:

@Override 
public void onItemSelected(Item item) { 
    // Displays a loading dialog 
    showLoadDialog(); 
    Item pi = item; 
    // This builds an image from the web, it might be slow depending on the 
    // phone's connection 
    pi.genImage(); 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    hideLoadDialog(); 
    ft.addToBackStack(Constants.DETAILS_STACK) 
    .add(android.R.id.content, DetailsFragment.newInstance(0,pi)) 
    .commit(); 
} 

回答

1

我主要是解決了這個問題。該解決方案特定於我的實現,但速度緩慢是由於我正在執行大量的處理器密集型任務,其中一些是在UI線程上完成的,其中一些已經佔用了相當一部分內存。

我通過從服務器拉下數據並直接在內存中構建圖像,然後將該位圖添加到網格視圖來構建位圖(在非ui線程上)。更好的辦法是使用AsyncTask將圖像下載到SD卡上,然後通過參考它們在SD卡上的位置來添加這些圖像。速度更快,使我的應用程序響應更快。