小编h4l*_*c0n的帖子

Android背景图片内存使用情况

我正在研究的项目使用了几个"高分辨率"背景(请注意引号).只是为了进入情境,其中一个是640x935 1.19M PNG文件.据我所知,即使Android将图像作为原始数据解压缩到内存中,这应该是:

640 x 935 x 4bytes = 2.39M

我的项目中存在内存问题,我无法理解,希望有人可以对此事进行阐述.我将列出我正在开发的两个设备以及一些结果.

为了确保这不是次要问题,我在第一次创建活动时没有加载背景,然后当用户按下按钮时,它所做的只是:

findViewById(R.id.completed_block_background).setBackgroundResource(R.drawable.blockbackgroundbottom1);
Run Code Online (Sandbox Code Playgroud)

然后,在进程上使用带有"Update Heap"的DDMS(并且首先强制GC确保这不会成为问题),我得到以下内存结果:

Nexus S:从18M上升到26M(8M差异)

Galaxy Nexus:从28M到39M(11M差异)

因此,正如您所看到的,将理论上2.39M未压缩的图像放入背景实际上会增加8M和11M的内存使用量.有人可以解释为什么这个以及是否有任何解决方案?

我能找到的唯一解决方案是使用位图将分辨率减半或降低通道格式(到目前为止,这就是我所做的,将它们切换为565 RGB,但这会产生一些我无法接受的条带问题).

如果没有什么可以做的话,我也会接受解释为什么会这样.提前致谢.

memory android background

56
推荐指数
1
解决办法
2万
查看次数

使用后释放iOS UIWebView资源

我们的应用程序的主屏幕(因此是所有用户首次看到的)有几个部分,其中大部分包含用户可能想要打开的不同webview.这样做可以将内存使用量从仅仅26MB增加到85MB甚至更多(打开所有不同的webview后).

我们发现的问题是,一旦它们关闭,所有网页资源似乎都保存在内存中(使用的内存几乎不会减少几MB).

我想释放webview必须打开的资源,因为,稍后,我们的应用程序中有一个非常苛刻的部分需要大量内存并且如果你碰巧浏览了几个这样的网页浏览器会完全崩溃应用程序之前.

我在互联网上找到了几个选项,但到目前为止它们都没有.事情如:

// Try to clean used webview

[self.webView loadHTMLString:@"" baseURL:nil];
[self.webView stopLoading];
self.webView.delegate = nil;
[self.webView removeFromSuperview];
self.webView = nil;
Run Code Online (Sandbox Code Playgroud)

它们对内存使用几乎没有任何影响.这里有什么我想念的吗?我已经仔细检查过我没有泄漏可以保持WebView打开,我已经释放了我对它的唯一引用(self.webView = nil;)

编辑:我刚从头创建了一个项目,添加了一个webview和一个按钮,每次点击它时都会加载一个不同的web,这反过来会增加内存使用量.我还添加了一个按钮,在点击时会破坏webview,并猜测,内存保持不变,就像它实际上没有释放任何资源一样.

memory uiwebview ios

28
推荐指数
2
解决办法
1万
查看次数

在C++ 11中实现boost :: barrier

我一直试图让一个项目摆脱每个boost参考并切换到纯C++ 11.

有一次,创建了线程工作者,它等待一个障碍来给出'go'命令,完成工作(通过N个线程传播)并在所有这些完成时同步.基本思想是主循环给出了go命令(boost :: barrier .wait())并等待具有相同函数的结果.

我在一个不同的项目中实现了一个基于Boost版本的定制Barrier,一切都运行得很好.实施如下:

Barrier.h:

class Barrier {
public:
    Barrier(unsigned int n);
    void Wait(void);
private:
    std::mutex counterMutex;
    std::mutex waitMutex;

    unsigned int expectedN;
    unsigned int currentN;
};
Run Code Online (Sandbox Code Playgroud)

Barrier.cpp

Barrier::Barrier(unsigned int n) {
    expectedN = n;
    currentN = expectedN;
}

void Barrier::Wait(void) {
    counterMutex.lock();

    // If we're the first thread, we want an extra lock at our disposal

    if (currentN == expectedN) {
        waitMutex.lock();
    }

    // Decrease thread counter

    --currentN;

    if (currentN == 0) {
        currentN = expectedN;
        waitMutex.unlock(); …
Run Code Online (Sandbox Code Playgroud)

multithreading barrier c++11

16
推荐指数
2
解决办法
9702
查看次数

获取当前元素的touchstart坐标

所以我有一个看起来像这样的元素:

 ____________________________________
/                                    \
|                                    |
|                                    |
+------------------------------------+
|                                    |
|                                    |
|                                    |
+------------------------------------+
|                                    |
|                                    |
\____________________________________/
Run Code Online (Sandbox Code Playgroud)

我已经附加了一个touchstart监听器,如下所示:

    other_options.addEventListener('touchstart', function(e) {
        event.preventDefault();
    }, false);
Run Code Online (Sandbox Code Playgroud)

我想做什么,而且我已经查看了'e'的值,但我找不到任何足够一致的值(当我尝试它时,值对我来说似乎不对)来做我想要的.

我知道那些行的大小.我只想获取touchstart事件触发位置的Y坐标,为元素的上坐标.这样,Math.floor(y/ROW_SIZE)将为我提供touchstart事件开始的行.

html javascript html5

10
推荐指数
2
解决办法
1万
查看次数

imagebutton设置图像大小

所以想象一下你的布局上有几个按钮.该项目即将完成,并且有很多动态的东西(以编程方式设置图像,监听器,声明的绘图等等).

现在,你被告知按钮有点棘手,所以你的第一个想法(至少是我的)是"好的,我只是让边界框更大".要做到这一点,我只需要给那些按钮增加更多的宽度和高度,这样它们就更容易点击.

当我看到那些按钮使用背景来存储图像时,我的问题出现了,因此,每当我将它们变大时,内部的图像就会变大.

我的问题是,我是不是必须在它上面创建一个布局,将监听器分配给这个新的更大的布局,然后将按钮保留为图像,还是有更简单的方法?

                                             /¯¯¯¯¯¯¯¯¯¯¯¯\ <- outter layout
                   /¯¯¯¯¯¯¯¯\                | /¯¯¯¯¯¯¯¯\ |
                   |        |                | |        | |
                   | BUTTON |      --->      | | BUTTON | |
                   |        |                | |        | |
                   \________/                | \________/ |
                                             \____________/
Run Code Online (Sandbox Code Playgroud)

谢谢

java layout android button

5
推荐指数
1
解决办法
615
查看次数

使用Android中的谷歌地图自定义信息窗口上的动画

我正在尝试在我的Android应用中使用自定义标记"气泡".为此,我创建了一个InfoWindowAdapter,它返回并填充View.

但是,出于某种原因,它似乎不允许我将动画应用于该视图(或内部的任何内容).我希望它以某种动画的方式弹出,但我可能会遗漏一些东西.

这是我到目前为止所尝试的:

map.setInfoWindowAdapter(new InfoWindowAdapter() {
    private final View contents = getLayoutInflater().inflate(R.layout.marker_layout, null);

    public View getInfoWindow(Marker marker) {
        TranslateAnimation animator = new TranslateAnimation(0.0f, 0.0f, 0.0f, 100.0f);

        animator.setDuration(2000);
        animator.setInterpolator(new AccelerateInterpolator());
        animator.setFillAfter(true);

        contents.findViewById(R.id.entity_name).clearAnimation();
        contents.findViewById(R.id.entity_name).startAnimation(animator);

        ((TextView) contents.findViewById(R.id.entity_name)).setText(marker.getTitle());
        return contents;
    }
/* ... */
Run Code Online (Sandbox Code Playgroud)

视图成功创建并填充,但没有明显的动画.如果我将相同的动画应用到布局的另一个元素,它可以完美地工作,所以我开始认为这是谷歌地图使用信息窗口的方式,也许呢?

java animation android google-maps google-api

2
推荐指数
1
解决办法
3170
查看次数