我有这个函数在函数中返回一个Image,使用Image.FromStream方法创建图像根据MSDN:
您必须在图像的生命周期内保持流打开
所以我没有关闭流(如果我关闭了蒸汽,则从返回的图像对象中抛出GDI +异常).我的问题是当在返回的Image上的其他地方调用Image.Dispose()时是否关闭/处理流
public static Image GetImage(byte[] buffer, int offset, int count)
{
var memoryStream = new MemoryStream(buffer, offset, count);
return Image.FromStream(memoryStream);
}
Run Code Online (Sandbox Code Playgroud)
正如其中一个答案中所建议的,使用不是要走的路,因为它会引发异常:
public static Image GetImage(byte[] buffer, int offset, int count)
{
using(var memoryStream = new MemoryStream(buffer, offset, count))
{
return Image.FromStream(memoryStream);
}
}
public static void Main()
{
var image = GetImage(args);
image.Save(path); <-- Throws exception
}
Run Code Online (Sandbox Code Playgroud)
我有5个片段,其中两个是列表片段,包含一些数据(昂贵的加载),其余的没有任何重要的.
我的目标是如何管理事务,以便只有一个List片段保留在内存中(始终),当我按下它时,它应该恢复到列表片段.这是一些部分代码,用于处理片段的on,但问题是当我按下它时不会卸载当前片段而是加载Main Fragment而不删除当前片段.
WorkFlow:主片段(任务片段)在开始后加载任何片段都可以加载.如果主要片段是当前的并且选择了组片段,则删除主片段,否则如果选择任何其他片段则保留(隐藏)主片段并加载新片段
注意:它与导航抽屉一起使用,其中1个片段在开始时加载
public class FragmentController {
private static final String TAG_MAIN = "main"; //Expensive
private static final String TAG_GROUP = "group"; //Expensive
private static final String TAG_PROFILE = "profile"; //Cheap
private static final String TAG_CREATE_TASK = "create_task"; //Cheap
private static final String TAG_CREATE_GROUP = "create_group";//Cheap
private static final String TAG_SETTINGS = "settings"; //Cheap
private android.support.v4.app.FragmentManager fragmentManager;
@IdRes private int container;
public FragmentController(android.support.v4.app.FragmentManager fragmentManager, @IdRes int container) {
this.fragmentManager = fragmentManager;
this.container = container;
}
public void showMainFragment() …
Run Code Online (Sandbox Code Playgroud) 将函数的返回值包装在类中是一个好主意.它提供了编码的简易性,你可以避免尝试...抓住我正在做这样的事情.
public class ResultWrapper
{
public bool Success{get;set;}
public Exception ErrorMessage{get;set;}
public object Result{get;set;} //not object essentially(any type)
public Result()
{
Success=false;
ErrorMessage="";
Result=null;
}
}
public ResultWrapper DoSomething(parameters....)
{
var result=new ResultWrapper()
try
{
}
catch(Exception ex)
{
result.Error=ex;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
然后称之为
static void main()
{
var result=DoSomething(parameters...);
if(result.Success)
{
//Carry on with result.Result;
}
else
{
//Log the exception or whatever... result.Error
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
考虑一下
static void main()
{
var result=Login(); //throws an exception
if(result.Success) …
Run Code Online (Sandbox Code Playgroud)