используйте startActivityForResult из бездействия

82

У меня есть MainActivity, который является Activity и другим классом (который представляет собой простой Java-класс), мы назовем его «SimpleClass». теперь я хочу запустить из этого класса команду startActivityForResult.

теперь я могу передать этот класс (SimpleClass), только контекст MainActivity, проблема в том, что вы не можете запустить context.startActivityForResult (...);

так что единственный способ заставить SimpleClass использовать startActivityForResult; - передать ссылку MainActivity в качестве переменной Activity в SimpleClass примерно так:

внутри класса MainActivity я создаю экземпляр SimpleClass следующим образом:

SimpleClass simpleClass=new SimpleClass(MainActivity.this);

вот как выглядит SimpleClass:

public Class SimpleClass {

Activity myMainActivity;

   public SimpleClass(Activity mainActivity) {
       super();
       this.myMainActivity=mainActivity;    
   }
....


    public void someMethod(...) {
        myMainActivity.startActivityForResult(...);
    }

}

теперь он работает, но разве это не правильный способ сделать это? Боюсь, у меня могут быть утечки памяти в будущем.

Благодарю. луч.

Rayman
источник
Я не знаю, что вы пытаетесь сделать, но вы должны это прочитать .
Macarse
1
Сделав это, вы могли бы использовать onActivityResultметод внутри своего simpleClass или не намеревались? Та же проблема здесь ..
Vivere_FlowCoder

Ответы:

64

Я не знаю, хорошая ли это практика или нет, но casting a Context object to an Activity objectкомпилируется нормально.

Попробуй это:

if (mContext instanceof Activity) {
        ((Activity) mContext).startActivityForResult(...);
} else {
        Log.e("mContext should be an instanceof Activity.");
} 

Это должно быть скомпилировано, а результаты должны быть доставлены в фактическое действие, содержащее контекст.

Какой-то студент-нуб
источник
Как насчет того, что контекст передается из службы?
Мадхур Ахуджа
9
Нет, запускается исключение приведения!
Лиза Энн
1
Контекст не обязательно является Деятельностью (например, если он уместенmyActivity.getApplicationContext()
Хьюго Гресс
Если цель состоит в том, чтобы избежать утечки памяти, какое преимущество в хранении контекста в качестве переменной-члена класса перед хранением активности? Разве хранение контекста не может привести к утечке памяти так же, как и сохранение активности?
stevehs17
4

Если вам нужно получить результат от предыдущего Activity, тогда ваш вызывающий класс должен иметь тип Activity.

Какова цель вашего звонка, Activity.startActivityForResult()если вы никогда не используете результат (по крайней мере, согласно опубликованному вами образцу кода).

Имеет ли myMainActivityсделать что - нибудь с результатом? Если да, то просто создайте SimpleClassподкласс Activity и обработайте результат изнутри SimpleClass.
Если myMainActivityнужен результат, то, возможно, вам следует провести рефакторинг кода, с которого будет начинаться действие myMainActivity.

кодинггер
источник
2
Я использую результат, просто хочу разделить его на другой класс, поэтому мне было интересно, как мне передать параметр Activity в класс, не являющийся активным, без утечек в будущем.
Rayman
1
Как насчет того, чтобы сделать SimpleClass вложенным классом?
codinguser
0

Лучшее решение:

  1. Создание SimpleClassподкласса вашего Activityкласса
  2. вызывая другое действие как startActivityForResult
  3. обработка результата внутри SimpleClassсебя
gtiwari333
источник
3
звучит так, как будто это должно работать, но я получил следующее:java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference
Boy