InputStreamをStringに変換しようとするとOutOfMemoryErrorが発生します。原因は何でしょうか。発生しないように出来ないでしょうか。
InputStreamはAndroidのプロジェクトのrawフォルダの中にあるバイナリファイル(5.5MB)を次のようにInputStreamに変換したものです。
Java
1 InputStream is = this.getRawResouces().openRawResouce();//thisは、ActivityのContext
メモリが876MBの環境でテストしています。
#ソースコード
##readメソッドを使って書いたコード
Java
1 static String convertInputStreamToString(InputStream is) throws IOException { 2 InputStreamReader reader = new InputStreamReader(is); 3 StringBuilder builder = new StringBuilder(); 4 char[] buf = new char[512]; 5 int numRead; 6 while (0 <= (numRead = reader.read(buf))) { 7 builder.append(buf, 0, numRead);//oom発生 8 } 9 buf=null; 10 return builder.toString(); 11 } 12//readLineは使っていません 13 static String inputStreamToString(InputStream is){ 14 BufferedReader reader = null; 15 try{ 16 reader = new BufferedReader(new InputStreamReader(is,"UTF-8")); 17 } 18 catch (UnsupportedEncodingException e){ 19 e.printStackTrace(); 20 } 21 StringBuilder sb = new StringBuilder(); 22 String b = null; 23 try{ 24 while ((b=reader.readLine()) !=null){ 25 sb.append(b); 26 } 27 } 28 catch (IOException e){ 29 30 } 31 return sb.toString(); 32 }
#呼び出し元
Java
1 private void checkVersion() throws Throwable{ 2 //呼び出し元は、onResume()のonClick() 3 InputStream versionStream=this.getResources().openRawResource(R.raw.git); 4 5 String verchecked=Event.convertInputStreamToString(versionStream); 6 //ココでreadメソッドを使って書いたコードを使って変換しようとするが、OoM発生、スローされる 7 versionStream.close();//closeは書いている 8 java.lang.Process p = null; 9 TextView vertext=(TextView) findViewById(R.id.version); 10 11 try{ 12 p=Runtime.getRuntime().exec(verchecked+" version"); 13 verchecked=null;//vercheckedはもう使わないからnull 14 InputStream returnVerison=p.getInputStream();//結果を返す 15 p=null;//pはもう使わないからnullを代入 16 String ver=Event.convertInputStreamToString(returnVerison); 17 returnVerison.close(); 18 vertext.setText(ver); 19 ver=null; 20 }catch (IOException e){ 21 e.printStackTrace(); 22 vertext.setText("取得失敗: "+e); 23 } 24 vertext=null; 25 } 26 27 protected void onResume(){ 28 super.onResume(); 29 //このクラスはMainActivity(最初に呼び出されるActivity)から呼び出される 30 Button Update=(Button) findViewById(R.id.UpdateButton); 31 Update.setOnClickListener(new OnClickListener(){ 32 @Override 33 public void onClick(View p1){ 34 try{ 35 checkVersion(); 36 }catch(OutOfMemoryError e){ 37 e.printStackTrace(); 38 Toast.makeText(GitUpdate.this,"取得失敗:"+e,Toast.LENGTH_SHORT).show(); 39 } 40 } 41 }); 42
#ヒープ
Android StudioでMemoryを見ました。
画像です。
へこんでいるところがInputStreamを変換したところです。
また、コード内でも確認しました。
MB単位です。
totalMemory(),MaxMemory()
7 ,96
#追加情報
別サイトにも前から投稿しています。別サイト:スタックオーバーフローこちらにも目を通しておいてください。
##スタックトレース
06-22 20:06:54.681 W/System.err(28046): java.lang.OutOfMemoryError 06-22 20:06:54.681 W/System.err(28046): at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:94) 06-22 20:06:54.681 W/System.err(28046): at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:145) 06-22 20:06:54.681 W/System.err(28046): at java.lang.StringBuilder.append(StringBuilder.java:216) 06-22 20:06:54.681 W/System.err(28046): at java.lang.ProcessManager.exec(ProcessManager.java:211) 06-22 20:06:54.681 W/System.err(28046): at java.lang.Runtime.exec(Runtime.java:173) 06-22 20:06:54.681 W/System.err(28046): at java.lang.Runtime.exec(Runtime.java:246) 06-22 20:06:54.681 W/System.err(28046): at java.lang.Runtime.exec(Runtime.java:189) 06-22 20:06:54.681 W/System.err(28046): at com.jimdo.solarand.git.GitUpdate.checkVersion(GitUpdate.java:153) 06-22 20:06:54.681 W/System.err(28046): at com.jimdo.solarand.git.GitUpdate.access$1000009(GitUpdate.java) 06-22 20:06:54.681 W/System.err(28046): at com.jimdo.solarand.git.GitUpdate$100000001.onClick(GitUpdate.java:50) 06-22 20:06:54.681 W/System.err(28046): at android.view.View.performClick(View.java:4487) 06-22 20:06:54.681 W/System.err(28046): at android.view.View$PerformClick.run(View.java:18746) 06-22 20:06:54.691 W/System.err(28046): at android.os.Handler.handleCallback(Handler.java:733) 06-22 20:06:54.691 W/System.err(28046): at android.os.Handler.dispatchMessage(Handler.java:95) 06-22 20:06:54.691 W/System.err(28046): at android.os.Looper.loop(Looper.java:149) 06-22 20:06:54.691 W/System.err(28046): at android.app.ActivityThread.main(ActivityThread.java:5257) 06-22 20:06:54.691 W/System.err(28046): at java.lang.reflect.Method.invokeNative(Native Method) 06-22 20:06:54.691 W/System.err(28046): at java.lang.reflect.Method.invoke(Method.java:515) 06-22 20:06:54.691 W/System.err(28046): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:788) 06-22 20:06:54.691 W/System.err(28046): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:604) 06-22 20:06:54.691 W/System.err(28046): at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132) 06-22 20:06:54.691 W/System.err(28046): at de.robv.android.xposed.XposedBridge.main(Native Method) 06-22 20:06:54.691 W/System.err(28046): at dalvik.system.NativeStart.main(Native Method)

回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/25 23:31 編集