我正在尝试将数据包发送到客户端,我注意到即使我没有设置初始容量也没有错误。
// data is another ByteBuf object
// With capacity
ByteBuf d = Unpooled.buffer(2 + data.array().length);
d.writeByte(identifiers[0]).writeByte(identifiers[1]).writeBytes(data.array());
// Without capacity
ByteBuf d = Unpooled.buffer();
d.writeByte(identifiers[0]).writeByte(identifiers[1]).writeBytes(data.array());
两者之间有什么区别吗?他们俩似乎都工作正常。
我还想知道我是否做对了,我正在使用ByteBuf
创建一个新的Unpooled.buffer
,在其中写入我的数据,并在发生以下情况时使用channel.write(ByteBuf)
将其发送到频道我需要发送一些东西给客户。我做对了吗?
答案 0 :(得分:4)
public class MediaActivity {
private MediaBrowserCompat mMediaBrowserCompat;
@Override
public void onCreate() {
super.onCreate(savedInstanceState);
mMediaBrowserCompat = new MediaBrowserCompat(
this,
new ComponentName(this, MediaPlayerService.class),
mMediaBrowserCompatConnectionCallback,
getIntent().getExtras()
);
mMediaBrowserCompat.connect();
}
}
private MediaBrowserCompat.ConnectionCallback mMediaBrowserCompatConnectionCallback = new MediaBrowserCompat.ConnectionCallback() {
@Override
public void onConnected() {
super.onConnected();
final MediaControllerCompat mcc = new MediaControllerCompat(MediaActivity.this, mMediaBrowserCompat.getSessionToken());
mcc.registerCallback(mMediaControllerCompatCallback);
MediaControllerCompat.setMediaController(mActivity, mcc);
}
};
public class MediaPlayerService extends MediaBrowserServiceCompat {
@Override
public void onCreate() {
super.onCreate();
//Should I add a startForeground notification here
}
}
private MediaSessionCompat.Callback mMediaSessionCallback = new MediaSessionCompat.Callback() {
@Override
public void onPlay() {
super.onPlay();
final NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
final NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelID)
...
startForeground(101, builder.build());
}
@Override
public void onPause() {
super.onPause();
}
};
创建一个新的big-endian Java堆缓冲区,其初始容量相当小,可以根据需要无限扩展其容量。
buffer()
用指定的容量创建一个新的big-endian Java堆缓冲区,根据需要无限扩展其容量。新缓冲区的readerIndex和writerIndex为0。
因此,buffer(int initialCapacity)
与buffer(int)
做相同的事情,但是具有指定的起始容量。如果您知道需要的容量比默认容量大,它将更好地执行,因为如果没有足够的容量,则不必继续扩展。 编辑:同样,如@yelliver所述,您可以通过指定来节省内存,具体取决于您创建的缓冲区对象数(或取决于缓冲区的大小)。
buffer()
似乎还设置了buffer(int)
可能没有的一些索引。
答案 1 :(得分:1)
不同之处在于它们具有不同的初始容量。
请参见buffer()
文档:
创建一个新的big-endian Java堆缓冲区,其较小 初始容量,可以根据需要无限扩展容量。
和buffer(int initialCapacity)
文档:
使用指定容量创建一个新的大端Java堆缓冲区, 可以根据需要无限扩展其容量。
答案 2 :(得分:0)
在一般的Java中,很多情况下您可以传递容量或不传递容量,两者都可以。如果您不通过该容量,它将具有默认容量,当容量已满时,它将自动扩展。例如:
String[] arr = list.toArray(new String[list.size()]);
//OR
String[] arr = list.toArray(new String[0]);
List<String> list = new ArrayList<>(10);
//OR
List<String> list = new ArrayList<>();
如果您使用默认容量:
如果您通过了意图能力: