java - Android 滑动菜单 - 其中包含用户名和图像。我怎样才能永远加载它们

标签 java android slidingmenu

我的 Android 应用程序中有一个滑动菜单和一个操作栏。 在滑动菜单的顶部有一个用户名和一张用户图片 如果我设置一次,当我关闭并再次打开菜单时它们会丢失。

所以每次打开我都会调用一个用户详细信息下载器类,然后我重新设置名称和头像,这很烦人。

无论滑动菜单是打开还是关闭,我怎样才能设置一次并且在应用程序关闭之前不关心这个?

public class AsdActionBarAndSlidingMenu extends AsdActionBar implements IOnUserDetailsAndStatsReceivedListener{ 
    private TextView tvSlidingMenuUserName;
    private Typeface font2;
    private UserDetailsAndStatsDownloader mUserDetailsDownloader;
    private String userName;
    private ImageView ivSlidingMenuUserAvatar;
    private String avatarPath;
    private Bitmap ivSlidingMenuUserBitmap;
    private static final String APP_SHARED_PREFS = "asdasd_prefs";
    SharedPreferences sharedPrefs;
    public Editor editor;
    protected int currentlyLoggedInUser;
    protected String currentlyLoggedInUserString;

    public AsdActionBarAndSlidingMenu(int titleRes) {
        super(R.string.app_name);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setBehindContentView(R.layout.menu_frame);
        sharedPrefs = getApplicationContext().getSharedPreferences(APP_SHARED_PREFS, Context.MODE_PRIVATE);

        currentlyLoggedInUser = sharedPrefs.getInt("currentLoggedInUserId", 0);
        currentlyLoggedInUserString = Integer.toString(currentlyLoggedInUser);



        tvSlidingMenuUserName = (TextView) findViewById(R.id.tvSlidingMenuUserName);
        tvSlidingMenuUserName.setTypeface(font2);

        getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.menu_frame, new AsdSlidingMenuListFragment()).commit();   
        getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
        setSlidingActionBarEnabled(true);

        getSlidingMenu().setOnOpenedListener(new OnOpenedListener() {

            @Override
            public void onOpened() {

                mUserDetailsDownloader = new UserDetailsAndStatsDownloader(currentlyLoggedInUserString, AsdActionBarAndSlidingMenu.this, AsdActionBarAndSlidingMenu.this);
                mUserDetailsDownloader.downloadUserDetailsAndStats();

            }
        });
    }
    @Override
    public void onUserDetailsAndStatsReceivedListener(UserDetailsAndStats userDetailsAndStats) {
        userName = userDetailsAndStats.getUserName();
        tvSlidingMenuUserName = (TextView) findViewById(R.id.tvSlidingMenuUserName);
        tvSlidingMenuUserName.setText(userName);

        avatarPath = userDetailsAndStats.getUserAvatar();
        ivSlidingMenuUserBitmap = BitmapFactory.decodeFile(avatarPath);
        ivSlidingMenuUserAvatar = (ImageView) findViewById(R.id.ivSlidingMenuUserAvatar);
        ivSlidingMenuUserAvatar.setImageBitmap(ivSlidingMenuUserBitmap);

    }

}

最佳答案

但是,未设置的是 BitMapViews(ivSlidingMenuUserAvatartvSlidingMenuUserName)?

我不知道您是如何创建 UserDetailsAndStatsDownloader 的,但可能 onUserDetailsAndStatsReceivedListener 是在不同的线程中调用的。这可能会导致当该线程未运行且未使用这些 View 时,您可能会丢失它们。但我不确定。

无论如何,尝试在您的 onCreate 中膨胀 View ,然后再检索数据

public void onCreate(Bundle savedInstanceState) {  
   ...
   tvSlidingMenuUserName = (TextView) findViewById(R.id.tvSlidingMenuUserName);
   ivSlidingMenuUserAvatar = (ImageView) findViewById(R.id.ivSlidingMenuUserAvatar);
  mUserDetailsDownloader = new UserDetailsAndStatsDownloader(currentlyLoggedInUserString, AsdActionBarAndSlidingMenu.this, AsdActionBarAndSlidingMenu.this);
                mUserDetailsDownloader.downloadUserDetailsAndStats();   
}

让听者像这样

@Override
public void onUserDetailsAndStatsReceivedListener(UserDetailsAndStats userDetailsAndStats){
    userName = userDetailsAndStats.getUserName();
    tvSlidingMenuUserName.setText(userName);
    avatarPath = userDetailsAndStats.getUserAvatar();
    ivSlidingMenuUserBitmap = BitmapFactory.decodeFile(avatarPath);
    ivSlidingMenuUserAvatar.setImageBitmap(ivSlidingMenuUserBitmap);
}

然后,删除 getSlidingMenu().setOnOpenedListener(...) 让我们看看发生了什么。

此外,您应该使用任何缓存方法进行下载,因此即使您需要再次下载文件,如果您已经下载过,也不会涉及网络操作。例如,您可以像 android-imagedownloader 中所示那样做这是一个非常简单的例子。

 /*
     * Cache-related fields and methods.
     * 
     * We use a hard and a soft cache. A soft reference cache is too aggressively cleared by the
     * Garbage Collector.
     */

    private static final int HARD_CACHE_CAPACITY = 10;
    private static final int DELAY_BEFORE_PURGE = 10 * 1000; // in milliseconds

    // Hard cache, with a fixed maximum capacity and a life duration
    private final HashMap<String, Bitmap> sHardBitmapCache =
        new LinkedHashMap<String, Bitmap>(HARD_CACHE_CAPACITY / 2, 0.75f, true) {
        @Override
        protected boolean removeEldestEntry(LinkedHashMap.Entry<String, Bitmap> eldest) {
            if (size() > HARD_CACHE_CAPACITY) {
                // Entries push-out of hard reference cache are transferred to soft reference cache
                sSoftBitmapCache.put(eldest.getKey(), new SoftReference<Bitmap>(eldest.getValue()));
                return true;
            } else
                return false;
        }
    };

    // Soft cache for bitmaps kicked out of hard cache
    private final static ConcurrentHashMap<String, SoftReference<Bitmap>> sSoftBitmapCache =
        new ConcurrentHashMap<String, SoftReference<Bitmap>>(HARD_CACHE_CAPACITY / 2);

    private final Handler purgeHandler = new Handler();

    private final Runnable purger = new Runnable() {
        public void run() {
            clearCache();
        }
    };

    /**
     * Adds this bitmap to the cache.
     * @param bitmap The newly downloaded bitmap.
     */
    private void addBitmapToCache(String url, Bitmap bitmap) {
        if (bitmap != null) {
            synchronized (sHardBitmapCache) {
                sHardBitmapCache.put(url, bitmap);
            }
        }
    }

    /**
     * @param url The URL of the image that will be retrieved from the cache.
     * @return The cached bitmap or null if it was not found.
     */
    private Bitmap getBitmapFromCache(String url) {
        // First try the hard reference cache
        synchronized (sHardBitmapCache) {
            final Bitmap bitmap = sHardBitmapCache.get(url);
            if (bitmap != null) {
                // Bitmap found in hard cache
                // Move element to first position, so that it is removed last
                sHardBitmapCache.remove(url);
                sHardBitmapCache.put(url, bitmap);
                return bitmap;
            }
        }

        // Then try the soft reference cache
        SoftReference<Bitmap> bitmapReference = sSoftBitmapCache.get(url);
        if (bitmapReference != null) {
            final Bitmap bitmap = bitmapReference.get();
            if (bitmap != null) {
                // Bitmap found in soft cache
                return bitmap;
            } else {
                // Soft reference has been Garbage Collected
                sSoftBitmapCache.remove(url);
            }
        }

        return null;
    }

    /**
     * Clears the image cache used internally to improve performance. Note that for memory
     * efficiency reasons, the cache will automatically be cleared after a certain inactivity delay.
     */
    public void clearCache() {
        sHardBitmapCache.clear();
        sSoftBitmapCache.clear();
    }

如果我们有涉及的其余类的代码(只是您编写的那些),帮助可能会更加准确。

关于java - Android 滑动菜单 - 其中包含用户名和图像。我怎样才能永远加载它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20359490/

相关文章:

Java:什么库用于创建如下图?

java - Java synchronized 关键字是否刷新缓存?

android - 如何从后台服务启动 Activity

Android 获取 SlidingMenu 状态?

队列数据结构的Java数组表示

java - Eclipse插件开发-关闭Eclipse透视重置

android - 如何让 Glide 保持连接?

javascript - Cordova iOS 相机插件返回空 snapshop

Android如何判断滑动菜单是否可见

android - 使用slidingmenu(jfeinstein10),如何知道是否显示了slidingmenu(有些方法不生效)