在Firebase数据库中单击AlertDialog以setValue时出错(Error when clicking AlertDialog to setValue at Firebase database)
我试图在AlertDialog中选择一个选项,但它显示一个错误。 以下是错误:
10-17 00:54:44.765 25600-25600/com.example.jingwen.bluetoothlowenergy E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.jingwen.bluetoothlowenergy, PID: 25600 java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0 at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) at java.util.ArrayList.get(ArrayList.java:308) at com.example.jingwen.bluetoothlowenergy.MainActivity$1$1.onClick(MainActivity.java:325) at android.support.v7.app.AlertController$AlertParams$3.onItemClick(AlertController.java:959) at android.widget.AdapterView.performItemClick(AdapterView.java:300) at android.widget.AbsListView.performItemClick(AbsListView.java:1143) at android.widget.AbsListView$PerformClick.run(AbsListView.java:3063) at android.widget.AbsListView$3.run(AbsListView.java:3881) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5237) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707)
这是发生错误的代码,特别是Firebase数据库的setValue部分:
private void alertdialog() { final CharSequence peers[] = new CharSequence[] {"Home", "School", "Children"}; stopScan(); final String uid = firebaseAuth.getCurrentUser().getUid(); if(alert11!=null && alert11.isShowing()) return; AlertDialog.Builder builder1 = new AlertDialog.Builder(this); builder1.setMessage("Add this device to peer list?"); builder1.setCancelable(true); builder1.setNegativeButton( "Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialog.Builder pbuilder = new AlertDialog.Builder(MainActivity.this); pbuilder.setTitle("Set peer as:"); pbuilder.setCancelable(false); pbuilder.setItems(peers, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // the user clicked on option[which] if(which == 0) { databaseRef.child("users").child(uid).child("Peer list").child(mBTDevicesArrayList.get(post).getAddress()).setValue("Home"); Toast.makeText(MainActivity.this,"Set peer as 'Home'",Toast.LENGTH_SHORT).show(); Toast.makeText(MainActivity.this,"Peer list updated!",Toast.LENGTH_SHORT).show(); } if(which == 1) { databaseRef.child("users").child(uid).child("Peer list").child(mBTDevicesArrayList.get(post).getAddress()).setValue("School"); Toast.makeText(MainActivity.this,"Set peer as 'School'",Toast.LENGTH_SHORT).show(); Toast.makeText(MainActivity.this,"Peer list updated!",Toast.LENGTH_SHORT).show(); } if(which == 2) { databaseRef.child("users").child(uid).child("Peer list").child(mBTDevicesArrayList.get(post).getAddress()).setValue("Children"); Toast.makeText(MainActivity.this,"Set peer as 'Children'",Toast.LENGTH_SHORT).show(); Toast.makeText(MainActivity.this,"Peer list updated!",Toast.LENGTH_SHORT).show(); } } }); pbuilder.show(); } });
请告诉我是否有更多部分代码需要显示。
I tried to select an option at AlertDialog but it shows an error. Below is the error:
10-17 00:54:44.765 25600-25600/com.example.jingwen.bluetoothlowenergy E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.jingwen.bluetoothlowenergy, PID: 25600 java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0 at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) at java.util.ArrayList.get(ArrayList.java:308) at com.example.jingwen.bluetoothlowenergy.MainActivity$1$1.onClick(MainActivity.java:325) at android.support.v7.app.AlertController$AlertParams$3.onItemClick(AlertController.java:959) at android.widget.AdapterView.performItemClick(AdapterView.java:300) at android.widget.AbsListView.performItemClick(AbsListView.java:1143) at android.widget.AbsListView$PerformClick.run(AbsListView.java:3063) at android.widget.AbsListView$3.run(AbsListView.java:3881) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5237) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707)
This is the code where the error occurs, specifically the setValue part to Firebase database :
private void alertdialog() { final CharSequence peers[] = new CharSequence[] {"Home", "School", "Children"}; stopScan(); final String uid = firebaseAuth.getCurrentUser().getUid(); if(alert11!=null && alert11.isShowing()) return; AlertDialog.Builder builder1 = new AlertDialog.Builder(this); builder1.setMessage("Add this device to peer list?"); builder1.setCancelable(true); builder1.setNegativeButton( "Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { AlertDialog.Builder pbuilder = new AlertDialog.Builder(MainActivity.this); pbuilder.setTitle("Set peer as:"); pbuilder.setCancelable(false); pbuilder.setItems(peers, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // the user clicked on option[which] if(which == 0) { databaseRef.child("users").child(uid).child("Peer list").child(mBTDevicesArrayList.get(post).getAddress()).setValue("Home"); Toast.makeText(MainActivity.this,"Set peer as 'Home'",Toast.LENGTH_SHORT).show(); Toast.makeText(MainActivity.this,"Peer list updated!",Toast.LENGTH_SHORT).show(); } if(which == 1) { databaseRef.child("users").child(uid).child("Peer list").child(mBTDevicesArrayList.get(post).getAddress()).setValue("School"); Toast.makeText(MainActivity.this,"Set peer as 'School'",Toast.LENGTH_SHORT).show(); Toast.makeText(MainActivity.this,"Peer list updated!",Toast.LENGTH_SHORT).show(); } if(which == 2) { databaseRef.child("users").child(uid).child("Peer list").child(mBTDevicesArrayList.get(post).getAddress()).setValue("Children"); Toast.makeText(MainActivity.this,"Set peer as 'Children'",Toast.LENGTH_SHORT).show(); Toast.makeText(MainActivity.this,"Peer list updated!",Toast.LENGTH_SHORT).show(); } } }); pbuilder.show(); } });
Do tell me if there are more parts of the codes need to be shown.
原文:https://stackoverflow.com/questions/40073000
最满意答案
我不知道那里发生了什么(我只是用高度压缩的gzip文件重现了缓慢),但是一次解压缩的速度更快,如下所示:
def decompress(io, int_size = 3) array = Array.new(262144) i = 0 io.rewind gz = Zlib::GzipReader.new(io) dec = gz.read seq = StringIO.new(dec, "rb") until seq.eof? buffer = seq.read(int_size) array[i] = buffer.unpack('C*').inject { |r, n| r << 8 | n } i += 1 end array end
更快的还是使用
map
而不是循环:def decompress(io, int_size = 3) io.rewind gz = Zlib::GzipReader.new(io) dec = gz.read dec.unpack('C*').each_slice(int_size).to_a.map {|t| t.inject {|r,n| r << 8 | n}} end
I'm not sure what's going on there (I reproduced the slowness only with a highly compressed gzip file), but decompressing all at once is faster, something like this:
def decompress(io, int_size = 3) array = Array.new(262144) i = 0 io.rewind gz = Zlib::GzipReader.new(io) dec = gz.read seq = StringIO.new(dec, "rb") until seq.eof? buffer = seq.read(int_size) array[i] = buffer.unpack('C*').inject { |r, n| r << 8 | n } i += 1 end array end
Faster still would be to use
map
instead of a loop:def decompress(io, int_size = 3) io.rewind gz = Zlib::GzipReader.new(io) dec = gz.read dec.unpack('C*').each_slice(int_size).to_a.map {|t| t.inject {|r,n| r << 8 | n}} end
相关问答
更多-
使用gzip这是一个简单的方法: Python代码: import gzip content = "the quick brown fox" with gzip.open('fox.txt.gz', 'wb') as f: f.write(content) Clojure代码: (with-open [in (java.util.zip.GZIPInputStream. (clojure.java.io/input-stream " ...
-
事实证明,zlib离gzip不远。 区别在于gzip有一个额外的标题。 要获得此标头,您可以像这样使用lua-zlib : local zlib = require "zlib" -- input: string -- output: string compressed with gzip function compress(str) local level = 5 local windowSize = 15+16 return zlib.deflate(level, windowSi ...
-
使用zlib解压缩PNG(Decompress PNG using zlib)[2023-10-02]
我编写了一个基本的Java库来读/写PNG文件: http : //code.google.com/p/pngj/ 它不支持托盘图像,但除 [更新:它现在支持所有PNG变体]之外,它相当完整,简单,并且代码没有外部依赖性(即仅使用标准JSE API,其中包括zip解压缩)。 代码可用。 我想你可以用很少的努力将它移植到C上。 I've code once a basic Java library for reading/writing PNG files: http://code.google.com/p/ ... -
上述方法对我来说没有效果 我不断得到incorrect header check (Zlib::DataError)错误。 显然它假设你有一个标题,默认情况下,这可能并非总是如此。 我实施的工作是: require 'zlib' require 'stringio' gz = Zlib::GzipReader.new(StringIO.new(resp.body.to_s)) uncompressed_string = gz.read The above method didn't work fo ...
-
要使用zlib解压缩gzip格式文件, inflateInit2 windowBits参数的windowBits调用为16+MAX_WBITS ,如下所示: inflateInit2(&stream, 16+MAX_WBITS); 如果你不这样做,zlib会抱怨坏的流格式。 默认情况下,zlib创建具有zlib头的流,而在inflate不能识别不同的gzip标题,除非你这么说。 虽然这是从zlib.h头文件的1.2.1版开始记录的,但它不在zlib手册中 。 从头文件: 对于可选的gzip解码, wind ...
-
文档表明Ruby inflate类将解压缩compress2()的输出,该输出采用zlib格式。 我刚尝试过,它运行正常。 您的压缩数据可能无法完整地保存到Ruby。 The documentation indicates that the Ruby inflate class will decompress the output of compress2(), which is in the zlib format. I just tried it, and it works fine. Your com ...
-
如果您使用的是不使用LF分隔符但CR + LF的平台,则可能需要以二进制模式打开文件以进行读取: File.open("file_compressed.gz", "rb") do |compressed| # ... end 这也应该避免将输入流解释为除8位二进制之外的任何内容。 请务必使用"wb"作为标志以相同的方式打开输出文件。 If you're on a platform that doesn't use LF delimiters, but CR+LF, you may need to op ...
-
您可以使用IO #read从文件中读取任意长度的块。 require 'zlib' Zlib::GzipWriter.open('compressed_file.gz') do |gz| File.open(large_data_file) do |fp| while chunk = fp.read(16 * 1024) do gz.write chunk end end gz.close end 这将以16kb块的形式读取源文件,并将每个压缩块添加到输出流中。 根据您的环境 ...
-
我不知道那里发生了什么(我只是用高度压缩的gzip文件重现了缓慢),但是一次解压缩的速度更快,如下所示: def decompress(io, int_size = 3) array = Array.new(262144) i = 0 io.rewind gz = Zlib::GzipReader.new(io) dec = gz.read seq = StringIO.new(dec, "rb") until seq.eof? buf ...
-
TArray
和TMemoryStream之间的转换函数是错误的,因为您没有正确访问数组内容。 TArray是一个动态数组。 在调用TMemoryStream.Write()和TMemoryStream.Read() ,您传递的是TArray本身的内存地址,而不是TArray指向的数据的内存地址。 您需要引用TArray以获取正确的内存地址,例如: function ByteArrayToStream(const aContent: TArray ): TMemoryStream; be ...