Как один из простейших вариантов передать его через статическую переменную
Во фрагменте A создать статическое поле
companion object {
public var globalBitmap: Bitmap? = null
}
, а во фрагменте A в методе onActivityResult
сохранить растровое изображение в подобная статическая переменная
...
if (requestCode == CAMERA_CAPTURE && resultCode == Activity.RESULT_OK) {
val extras = data?.extras
if (extras != null) {
globalBitmap = extras.get("data") as Bitmap
startActivityForResult(intent, 12)
}
}
...
В Деятельности B считывает растровое изображение результата из фрагмента Статическая переменная, подобная этому
FragmentA.globalBitmap
Вы можете рефакторинг кода, чтобы принять экземпляр указателя метода (также известный как System.Action ).
public void CallWithLogTiming (Action theAction)
{
Logger logger = new Logger();
System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
logger.LogInformation("Calling SomeObject.SomeMethod at " + DateTime.Now.ToString());
stopWatch.Start();
// This is the method I'm interested in.
theAction();
stopWatch.Stop();
logger.LogInformation("SomeObject.SomeMethod returned at " + DateTime.Now.ToString());
logger.LogInformation("SomeObject.SomeMethod took " + stopWatch.ElapsedMilliseconds + " milliseconds.");
}
Затем вы можете вызвать его путем создания лямбда-выражения. Поскольку myResponse является захваченной переменной, она будет заполнена при запуске этого действия, и myResponse будет доступен для использования позже в этой области.
SomeResponse myResponse = null;
CallWithLogTiming( () => myResponse = someObject.SomeMethod(someParam) );
Как насчет того, чтобы унаследовать класс таймера от всех своих объектов?
Вы можете сделать синтаксис немного чище с помощью некоторых простых методов расширения в Logger, это не требует дополнительных сборок, чем то, что у вас уже есть, и вы можете подключить его сразу. И его можно использовать повторно, если вы собираетесь делать это несколько раз в своем коде.
public static class LoggerExtentions
{
public static void StartTimerLogInformation(this Logger logger, Stopwatch stopWatch, string method)
{
stopWatch.Reset();
stopWatch.Start();
logger.LogInformation(string.Format("Calling {0} at {1}", method, DateTime.Now.ToString()));
}
public static void StopTimerLogInformation(this Logger logger, Stopwatch stopWatch, string method)
{
stopWatch.Stop();
logger.LogInformation(string.Format("{0} returned at {1}", method, DateTime.Now.ToString()));
logger.LogInformation(string.Format("{0} took {1} milliseconds", method, stopWatch.ElapsedMilliseconds));
stopWatch.Reset();
}
}
тогда вы можете просто использовать этот код вместо кода, который у вас есть в исходном сообщении
Logger logger = new Logger();
Stopwatch stopWatch = new Stopwatch();
logger.StartTimerLogInformation(stopWatch, "SomeObject.SomeMethod");
SomeResponse response = someObject.SomeMethod(someParam);
logger.StopTimerLogInformation(stopWatch, "SomeObject.SomeMethod");
Всегда есть библиотека PostSharp , которая позволяет создавать аспектно-ориентированный код. Это позволяет вам вести журнал и секундомер в качестве атрибута, что здорово. Он вставит код до и после компиляции в ваш метод на этапе посткомпиляции.
Кроме того, вы можете рассмотреть некоторые статические методы таймера / регистратора, подобные этому, чтобы обернуть код, который вы хотите записать в журнал:
Timer.LogExecutionTime("SomeObject.SomeMethod", () =>
{
Logger.LogBeforeAndAfter("SomeObject.SomeMethod", () =>
{
SomeResponse response = someObject.SomeMethod(someParam);
}
});
Если вы напишете такой класс (я использую Java; могут быть некоторые вещи, которые не переводятся точно):
public class myProfiler {
final String method;
final Logger logger = new Logger();
final System.Diagnostics.Stopwatch stopWatch = new Stopwatch();
public myProfiler(method) {this.method = method};
public void Start() {
logger.LogInformation("Calling " + method + " at " + DateTime.Now.ToString());
stopWatch.Start();
}
public void Stop() {
stopWatch.Stop();
logger.LogInformation(method + " returned at " + DateTime.Now.ToString());
logger.LogInformation(method + " took " + stopWatch.ElapsedMilliseconds + " milliseconds.");
}
}
Затем вы сократили код, который вам нужен в каждом методе, всего до
myProfiler profiler = new myProfiler("SomeObject.SomeMethod");
profiler.Start();
...
profiler.Stop();
Для простоты вы можете использовать дженерики , вот так (из моей головы):
public T MyLogMethod<T,S>(Func<S, T> someFunction, S someParameter) {}
Func (S, T), где S - тип параметра метода,
Я думаю, что реализую класс таймера, который может быть используется следующим образом:
void test()
{
foo();
//timer for the following statements
using (new MyTimer("Some method"))
{
bar();
}
baz();
}
Класс MyTimer реализован следующим образом:
Определенно кандидат в АОП. Для этого мы используем PostSharp. http://www.postsharp.org/