【发布时间】:2017-01-02 03:08:59
【问题描述】:
在我的 Android 应用程序中,我在一个线程中有一个循环,它对存储在 DoubleBuffer 对象中的数据进行一些处理。令我惊讶的是,put(DoubleBuffer) 似乎正在分配内存!
这是我应该预料到的吗?对我来说,这似乎违背了我对 NIO 缓冲区的理解。我应该做些什么来避免它?
我可以用一个简单的例子来重现这个,它只是在一个循环中的两个缓冲区之间复制。在运行 Android 4.4.2 的物理手机上通过 Android Studio 运行,日志中包含如下行:
D/dalvikvm: GC_FOR_ALLOC freed 2032K, 55% free 6556K/14500K, paused 11ms, total 11ms
如果我注释掉对put() 的调用,则不会发生这种情况。
这是我在“空活动”模板之上编写的重现此问题的代码:
public class MainActivity extends AppCompatActivity {
private Thread thread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onStart() {
super.onStart();
thread = new Thread(new Runnable() {
@Override
public void run() {
DoubleBuffer buffer1 = DoubleBuffer.allocate(5000);
DoubleBuffer buffer2 = DoubleBuffer.allocate(buffer1.capacity());
while (!Thread.interrupted()) {
// set remaining to capacity so that entire buffer is copied
buffer1.clear();
buffer2.clear();
buffer2.put(buffer1);
Thread.yield();
}
}
});
thread.setDaemon(true);
thread.start();
}
@Override
protected void onStop() {
if (thread != null) {
thread.interrupt();
thread = null;
}
super.onStop();
}
}
这是app/build.gradle的相关部分:
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
minSdkVersion 10
targetSdkVersion 25
}
}
dependencies {
compile 'com.android.support:appcompat-v7:25.1.0'
}
【问题讨论】:
-
您的代码毫无意义。将一个空缓冲区放入另一个缓冲区不会传输任何数据。尝试一些真实的东西。
-
@EJP
buffer.clear().remaining() == buffer.capacity(),所以它应该传输整个缓冲区。我没有生成虚假的测试数据,因为测试是内存使用情况。