找回密码
 立即注册

QQ登录

只需一步,快速开始

jssyy

中级会员

10

主题

72

帖子

574

积分

中级会员

积分
574
jssyy
中级会员   /  发表于:2016-4-28 17:05  /   查看:23864  /  回复:59
在android 平台运行LEADTOOLS18_Android\Examples\Android\DatasetDemo 的demo,频繁加载本地dicom文件,native heap 逐渐变大..写这个demo的开发人员也不好好测试一下

59 个回复

倒序浏览
AvoCaDolol活字格认证 Wyn认证
社区贡献组   /  发表于:2016-4-29 09:05:13
沙发
嘿嘿,你也说了是Demo嘛,就跟HelloWorld一个类型的,肯定是Bug很多。
请不要在意这些细节,Demo的产生主要为了展示功能,类似if (dicomFile == null)这种判断肯定是木有啦。
另外,对于释放内存以及垃圾回收考虑是木有滴,所以只能靠你自行发掘了。

以上,谢谢。
回复 使用道具 举报
jssyy
中级会员   /  发表于:2016-4-29 14:09:54
板凳
做如下判断 if (_loadedImage != null){
                  _loadedImage.dispose();
                  _loadedImage = null;
               }
好像native heap内存没有变小,想资源没有释放一样?请问这是什么情况,是函数用的不对吗?
回复 使用道具 举报
jssyy
中级会员   /  发表于:2016-4-29 17:23:07
地板
代码如下
  1. package leadtools.datasetdemo;

  2. import leadtools.ILeadStream;
  3. import leadtools.LeadEvent;
  4. import leadtools.LeadSizeF;
  5. import leadtools.LeadStreamFactory;
  6. import leadtools.RasterColor;
  7. import leadtools.RasterImage;
  8. import leadtools.RasterImageFormat;
  9. import leadtools.RasterSizeFlags;
  10. import leadtools.codecs.RasterCodecs;
  11. import leadtools.controls.ImageViewerCenterAtInteractiveMode;
  12. import leadtools.controls.ImageViewerInteractiveMode;
  13. import leadtools.controls.ImageViewerNoneInteractiveMode;
  14. import leadtools.controls.ImageViewerSizeMode;
  15. import leadtools.controls.ImageViewerMagnifyGlassInteractiveMode;
  16. import leadtools.controls.ImageViewerPanZoomInteractiveMode;
  17. import leadtools.controls.RasterImageViewer;
  18. import leadtools.demos.Messager;
  19. import leadtools.demos.OpenFileDialog;
  20. import leadtools.demos.Progress;
  21. import leadtools.demos.SplashScreen;
  22. import leadtools.demos.Support;
  23. import leadtools.demos.Utils;
  24. import leadtools.dicom.DicomDataSet;
  25. import leadtools.dicom.DicomDataSetLoadFlags;
  26. import leadtools.dicom.DicomElement;
  27. import leadtools.dicom.DicomEngine;
  28. import leadtools.dicom.DicomGetImageFlags;
  29. import leadtools.dicom.DicomLoadAsyncCompletedListener;
  30. import leadtools.dicom.DicomTag;
  31. import leadtools.imageprocessing.ResizeCommand;
  32. import leadtools.imageprocessing.core.ResizeInterpolateCommand;
  33. import leadtools.imageprocessing.core.ResizeInterpolateCommandType;

  34. import android.os.AsyncTask;
  35. import android.os.Bundle;
  36. import android.os.Environment;
  37. import android.os.Handler;
  38. import android.app.Activity;
  39. import android.app.AlertDialog;
  40. import android.app.Dialog;
  41. import android.app.ProgressDialog;
  42. import android.content.Context;
  43. import android.content.DialogInterface;
  44. import android.content.DialogInterface.OnDismissListener;
  45. import android.graphics.Color;
  46. import android.graphics.PointF;
  47. import android.view.LayoutInflater;
  48. import android.view.Menu;
  49. import android.view.View;
  50. import android.view.View.OnClickListener;
  51. import android.view.ViewGroup;
  52. import android.view.WindowManager;
  53. import android.widget.Button;
  54. import android.widget.EditText;
  55. import android.widget.RadioButton;
  56. import android.widget.RadioGroup;
  57. import android.widget.RadioGroup.OnCheckedChangeListener;
  58. import android.widget.TextView;
  59. import android.widget.Toast;

  60. import java.io.File;
  61. import java.io.FileInputStream;
  62. import java.io.FileNotFoundException;
  63. import java.io.FileOutputStream;
  64. import java.net.URI;
  65. import java.net.URISyntaxException;

  66. public class DatasetDemoActivity extends Activity {

  67.     private DicomDataSet _loadedDataSet;
  68.     private RasterImageViewer _imageViewer;
  69.     private TextView _noImageTextView;
  70.     private RasterImage _loadedImage;

  71.     private View _moreOptionsLinearLayout;
  72.     private ImageViewerSizeMode _currentSizeMode;

  73.     private ProgressDialog mProgressDlg;

  74.     @Override
  75.     protected void onCreate(Bundle savedInstanceState) {
  76.         super.onCreate(savedInstanceState);
  77.         setContentView(R.layout.activity_main);


  78.         DicomEngine.startup();
  79.         if (Support.isKernelExpired()) {
  80.             Messager.showKernelExpiredMessage(this, new OnDismissListener() {
  81.                 @Override
  82.                 public void onDismiss(DialogInterface dialog) {
  83.                     finish();
  84.                 }
  85.             });
  86.             return;
  87.         }
  88.         SplashScreen.show(this);


  89.         _imageViewer = (RasterImageViewer) findViewById(R.id.imageviewer);
  90.         _imageViewer.setImage(_loadedImage);
  91.         _imageViewer.setAutoFreeImages(true);

  92.         _noImageTextView = (TextView) findViewById(R.id.noImageTextView);
  93.         _moreOptionsLinearLayout = (View) findViewById(R.id.moreOptionsLinearLayout);

  94.         _currentSizeMode = ImageViewerSizeMode.FIT_ALWAYS;
  95.         _imageViewer.setSizeMode(_currentSizeMode);
  96.         _imageViewer.setTouchInteractiveMode(new ImageViewerPanZoomInteractiveMode());

  97.     }


  98.     public void onClickMoreButton(View view) {
  99.         Button moreButton = (Button) view;

  100.         if (_moreOptionsLinearLayout.getVisibility() == View.GONE) {
  101.             moreButton.setText("Less...");
  102.             _moreOptionsLinearLayout.setVisibility(View.VISIBLE);
  103.         } else {
  104.             moreButton.setText("More...");
  105.             _moreOptionsLinearLayout.setVisibility(View.GONE);
  106.         }
  107.     }

  108.     //频繁调用此函数会出现内存泄漏
  109.     public void onClickFileOption(View view) {

  110.         FileInputStream fileInputStream = null;
  111.         try {
  112.             fileInputStream = new FileInputStream("/sdcard/测试/测试/CR/CR.dcm");
  113.         } catch (FileNotFoundException e) {
  114.             e.printStackTrace();
  115.         }
  116.         if (fileInputStream != null) {
  117.             ILeadStream leadStream = LeadStreamFactory.create(fileInputStream, true);
  118.             if (leadStream != null) {
  119.                 mProgressDlg = Progress.show(DatasetDemoActivity.this, "", "Loading");
  120.                 DatasetDemoActivity.this.loadDataSetFromStream(leadStream);
  121.             }
  122.         }

  123.     }

  124.     private void loadDataSetFromStream(final ILeadStream stream) {
  125.         String tempPath = "/data/data/leadtools.datasetdemo/";
  126.         final DicomDataSet ds = new DicomDataSet(tempPath);
  127.         ds.addLoadAsyncCompletedListener(new DicomLoadAsyncCompletedListener() {
  128.             @Override
  129.             public void onLoadAsyncCompleted() {

  130.                 _loadedDataSet = ds;
  131.                 DicomElement pixelDataElement = _loadedDataSet.findFirstElement(null, DicomTag.PIXEL_DATA, true);

  132.                 if (pixelDataElement != null) {
  133.                     int bitmapCount = ds.getImageCount(pixelDataElement);
  134.                     _noImageTextView.setVisibility(View.GONE);

  135.                     if (_loadedImage != null) {
  136.                         _loadedImage.dispose();
  137.                         _loadedImage = null;
  138.                     }

  139.                     _loadedImage = getDataSetImages(_loadedDataSet, pixelDataElement, bitmapCount);


  140.                     _imageViewer.setImage(_loadedImage);
  141.                     _imageViewer.setSizeMode(_currentSizeMode);


  142.                     _imageViewer.setPaintFlags(2);


  143.                     Progress.close(mProgressDlg);
  144.                 }
  145.             }
  146.         });
  147.         ds.loadAsync(stream, DicomDataSetLoadFlags.LOAD_AND_CLOSE);

  148.     }

  149.     public RasterImage getDataSetImages(DicomDataSet ds, DicomElement element, int imageCount) {
  150.         RasterImage resultImage = null;
  151.         for (int x = 0; x < imageCount; x++) {
  152.             RasterImage image = null;

  153.             try {
  154.                 image = _loadedDataSet.getImage(element, x, 0, DicomGetImageFlags.AUTO_APPLY_MODALITY_LUT |
  155.                         DicomGetImageFlags.AUTO_APPLY_VOI_LUT);

  156.             } catch (Exception ex) {
  157.                 //DemoUtilities.ShowToast(ex);
  158.             }

  159.             if (image != null) {
  160.                 if (x == 0) {
  161.                     resultImage = image;
  162.                 } else {
  163.                     resultImage.addPage(image);
  164.                 }
  165.             } else {
  166.                 //string errorMsg = string.Format("Note that this dataset contains an invalid image.  No image will be displayed ");
  167.                 //DemoUtilities.ShowToast(errorMsg);
  168.                 break;
  169.             }
  170.         }
  171.         return resultImage;
  172.     }


  173. }
复制代码


我已经调用dispose释放RasterImage内存,native heap 还是持续增长,是不是leadtools 的库有内存泄漏,还是我使用的不对,求解答,谢谢!!!!!!!
回复 使用道具 举报
jssyy
中级会员   /  发表于:2016-4-29 17:48:09
5#

leadtools 内存泄漏疑问

代码如下:
  1. package leadtools.datasetdemo;

  2. import android.app.Activity;
  3. import android.app.ProgressDialog;
  4. import android.content.DialogInterface;
  5. import android.content.DialogInterface.OnDismissListener;
  6. import android.os.Bundle;
  7. import android.view.View;
  8. import android.widget.TextView;
  9. import java.io.FileInputStream;
  10. import java.io.FileNotFoundException;
  11. import leadtools.ILeadStream;
  12. import leadtools.LeadStreamFactory;
  13. import leadtools.RasterImage;
  14. import leadtools.controls.ImageViewerPanZoomInteractiveMode;
  15. import leadtools.controls.ImageViewerSizeMode;
  16. import leadtools.controls.RasterImageViewer;
  17. import leadtools.demos.Messager;
  18. import leadtools.demos.Progress;
  19. import leadtools.demos.SplashScreen;
  20. import leadtools.demos.Support;
  21. import leadtools.dicom.DicomDataSet;
  22. import leadtools.dicom.DicomDataSetLoadFlags;
  23. import leadtools.dicom.DicomElement;
  24. import leadtools.dicom.DicomEngine;
  25. import leadtools.dicom.DicomGetImageFlags;
  26. import leadtools.dicom.DicomLoadAsyncCompletedListener;
  27. import leadtools.dicom.DicomTag;

  28. public class DatasetDemoActivity extends Activity {

  29.     private DicomDataSet _loadedDataSet;
  30.     private RasterImageViewer _imageViewer;
  31.     private TextView _noImageTextView;
  32.     private RasterImage _loadedImage;

  33.     private ImageViewerSizeMode _currentSizeMode;

  34.     private ProgressDialog mProgressDlg;

  35.     @Override
  36.     protected void onCreate(Bundle savedInstanceState) {
  37.         super.onCreate(savedInstanceState);
  38.         setContentView(R.layout.activity_main);

  39.         DicomEngine.startup();
  40.         if (Support.isKernelExpired()) {
  41.             Messager.showKernelExpiredMessage(this, new OnDismissListener() {
  42.                 @Override
  43.                 public void onDismiss(DialogInterface dialog) {
  44.                     finish();
  45.                 }
  46.             });
  47.             return;
  48.         }
  49.         SplashScreen.show(this);

  50.         _imageViewer = (RasterImageViewer) findViewById(R.id.imageviewer);
  51.         _imageViewer.setImage(_loadedImage);
  52.         _imageViewer.setAutoFreeImages(true);

  53.         _noImageTextView = (TextView) findViewById(R.id.noImageTextView);

  54.         _currentSizeMode = ImageViewerSizeMode.FIT_ALWAYS;
  55.         _imageViewer.setSizeMode(_currentSizeMode);
  56.         _imageViewer.setTouchInteractiveMode(new ImageViewerPanZoomInteractiveMode());

  57.     }


  58.     //频繁调用此函数会出现内存泄漏
  59.     public void onClick(View view) {
  60.         FileInputStream fileInputStream = null;
  61.         try {
  62.             fileInputStream = new FileInputStream("/sdcard/测试/测试/CR/CR.dcm");
  63.         } catch (FileNotFoundException e) {
  64.             e.printStackTrace();
  65.         }
  66.         if (fileInputStream != null) {
  67.             ILeadStream leadStream = LeadStreamFactory.create(fileInputStream, true);
  68.             if (leadStream != null) {
  69.                 mProgressDlg = Progress.show(DatasetDemoActivity.this, "", "Loading");
  70.                 DatasetDemoActivity.this.loadDataSetFromStream(leadStream);
  71.             }
  72.         }

  73.     }

  74.     private void loadDataSetFromStream(final ILeadStream stream) {
  75.         String tempPath = "/data/data/leadtools.datasetdemo/";
  76.         final DicomDataSet ds = new DicomDataSet(tempPath);
  77.         ds.addLoadAsyncCompletedListener(new DicomLoadAsyncCompletedListener() {
  78.             @Override
  79.             public void onLoadAsyncCompleted() {
  80.                 _loadedDataSet = ds;
  81.                 DicomElement pixelDataElement = _loadedDataSet.findFirstElement(null, DicomTag.PIXEL_DATA, true);

  82.                 if (pixelDataElement != null) {
  83.                     int bitmapCount = ds.getImageCount(pixelDataElement);
  84.                     _noImageTextView.setVisibility(View.GONE);

  85.                     if (_loadedImage != null) {
  86.                         _loadedImage.dispose();
  87.                         _loadedImage = null;
  88.                     }

  89.                     _loadedImage = getDataSetImages(_loadedDataSet, pixelDataElement, bitmapCount);

  90.                     _imageViewer.setImage(_loadedImage);
  91.                     _imageViewer.setSizeMode(_currentSizeMode);
  92.                     _imageViewer.setPaintFlags(2);
  93.                     Progress.close(mProgressDlg);
  94.                 }
  95.             }
  96.         });
  97.         ds.loadAsync(stream, DicomDataSetLoadFlags.LOAD_AND_CLOSE);

  98.     }

  99.     public RasterImage getDataSetImages(DicomDataSet ds, DicomElement element, int imageCount) {
  100.         RasterImage resultImage = null;
  101.         for (int x = 0; x < imageCount; x++) {
  102.             RasterImage image = null;

  103.             try {
  104.                 image = _loadedDataSet.getImage(element, x, 0, DicomGetImageFlags.AUTO_APPLY_MODALITY_LUT |
  105.                         DicomGetImageFlags.AUTO_APPLY_VOI_LUT);
  106.             } catch (Exception ex) {
  107.                 //DemoUtilities.ShowToast(ex);
  108.             }

  109.             if (image != null) {
  110.                 if (x == 0) {
  111.                     resultImage = image;
  112.                 } else {
  113.                     resultImage.addPage(image);
  114.                 }
  115.             } else {
  116.                 //string errorMsg = string.Format("Note that this dataset contains an invalid image.  No image will be displayed ");
  117.                // DemoUtilities.ShowToast(errorMsg);
  118.                 break;
  119.             }
  120.         }
  121.         return resultImage;
  122.     }
  123. }
复制代码


我已经调用dispose释放RasterImage内存,native heap 还是持续增长,是不是leadtools 的库有内存泄漏,还是我使用的不对,求解答,谢谢!!!!!!!

回复 使用道具 举报
AvoCaDolol活字格认证 Wyn认证
社区贡献组   /  发表于:2016-5-3 10:33:13
6#
OK,问题已经收到。我这边无法再现这个问题。

我有个请求,能否将你做的程序打个包发给我,我会跟厂商联系请求技术支持。
回复 使用道具 举报
AvoCaDolol活字格认证 Wyn认证
社区贡献组   /  发表于:2016-5-3 10:34:43
7#

另外,我想知道你下载的Android开发版是什么时候下载的,因为4月20号有一版更新,修复了很多问题。
回复 使用道具 举报
jssyy
中级会员   /  发表于:2016-5-3 13:21:01
8#
本帖最后由 jssyy 于 2016-5-3 13:37 编辑

代码已发,IDE 为android studio

有解决方法,及时答复,谢谢!!!!!!!!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
jssyy
中级会员   /  发表于:2016-5-3 13:42:57
9#
下载地址:http://leadtools.gcpowertools.com.cn/downloads/?category=main,没有4月20最新,最新的下载android版的下载地址,可以发我一下吗
回复 使用道具 举报
AvoCaDolol活字格认证 Wyn认证
社区贡献组   /  发表于:2016-5-3 14:41:36
10#
jssyy 发表于 2016-5-3 13:42
下载地址:http://leadtools.gcpowertools.com.cn/downloads/?category=main,没有4月20最新,最新的下载an ...

就是这个:http://leadtools.gcpowertools.com.cn/downloads/download/?pid=703
你可以下载一个最新版试试看,现在的最新版是94M的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部