Finish () не завершает действие: Android

У меня есть Activity, в методе onCreate() которого я вызываю служебную функцию. Для этой служебной функции требуется экземпляр класса обратного вызова в качестве параметра, в котором он возвращает нужную мне информацию. Это:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);    
         Utility.functionA(new functionACallBack() {
                /**
                 * 
                 */
                private static final long serialVersionUID = -7896922737679366614L;

                @Override
                public void onResponse(String error) {

                     ((MyActivity) AppClass.getAppContext()).finish();
                }
            });
}

Как только я получу эту информацию, я хочу закрыть действие. поэтому я вызвал finish() из анонимного класса, который я создал для обратного вызова.

Но деятельность не заканчивается. Я подумал, может быть, мне нужно вызвать finish() из потока пользовательского интерфейса, поэтому я сделал runOnUiThread(), внутри него я также попытался вызвать finish(). Но это просто не работает.

Может ли кто-нибудь помочь мне с этой проблемой?

ОБНОВИТЬ:

Я сохраняю контекст приложения, а затем пытаюсь его использовать, но безрезультатно.

public class AppClass extends Application {

    private static Context mContext;

    @Override
    public void onCreate() {
        super.onCreate();
        AppClass.mContext = getApplicationContext();

    }

    public static Context getAppContext(){
        return AppClass.mContext;
    }
}

person Sunny    schedule 13.03.2014    source источник
comment
Вы пытались позвонить YourActivity.finish()?   -  person nKn    schedule 13.03.2014
comment
я пытался, но Utility.functionA() является статической функцией, и она не позволяет мне вызывать нестатическую функцию изнутри..   -  person Sunny    schedule 13.03.2014
comment
Затем попробуйте объявить функцию static в вашем Activity, которая вызовет YourActivity.finish() и вызовет эту функцию в вашем методе onResponse().   -  person nKn    schedule 13.03.2014
comment
Да, вам нужно вызвать финиш непосредственно из вашей деятельности, прямо сейчас он вызывается из вашей служебной функции.   -  person zgc7009    schedule 13.03.2014
comment
как мне это сделать... @zgc7009?   -  person Sunny    schedule 13.03.2014
comment
@nKn, как это должно работать? если у меня есть статическая функция, я столкнусь с той же проблемой, что и раньше?   -  person Sunny    schedule 13.03.2014
comment
@Санни, как ты решил это?   -  person Hong Zhou    schedule 17.01.2016


Ответы (2)


Просто вызовите что-то вроде этого:

@Override
public void onResponse(String error) {
  ((Activity) context).finish();
}

Поскольку это функция static, вы должны иметь доступ к Context static способом. Вы можете сохранить это как переменную класса, но вам нужно знать об ее обработке, так как это может привести к утечке памяти.

Чтобы избежать их, вы можете объявить класс, который extends Application, и сохранить здесь свой контекст, так что у вас никогда не будет утечки памяти.

person nKn    schedule 13.03.2014
comment
Вы не можете вызывать finish() таким static способом. - person codeMagic; 13.03.2014
comment
нет ничего под названием MyActivity.finish() - person Sunny; 13.03.2014
comment
Вы правы, я изменил код, так как для этого он должен использовать context. - person nKn; 13.03.2014
comment
но тогда я могу напрямую вызвать ((Activity) context).finish(); ответ изнутри? это не сработает? - person Sunny; 13.03.2014
comment
хорошо, я попробовал это, и я взял отдельный класс, в котором я сохранил контекст приложения. затем, когда я использую это здесь, я получаю исключение classcast - person Sunny; 14.03.2014
comment
Вы должны обновить код, который у вас есть в вашем вопросе, чтобы увидеть, где ошибка. - person nKn; 14.03.2014
comment
Как вы получаете Context из этого класса? Должно быть примерно так: AppClass appclass = ((AppClass) getApplicationContext()); final Context myContext = appclass.getContext(); - person nKn; 14.03.2014
comment
но не будет ли это работать, так как я сохраняю его в AppClass как статическую переменную, а затем вызываю через статический метод? что в этом плохого? - person Sunny; 14.03.2014
comment
Да, именно это я и делаю этими двумя строчками. Первый получает объект static внутри приложения (таким образом вы получите фактическое значение Context везде, где вы его объявите), а второй возвращает Context, что вам и нужно в этот момент. - person nKn; 14.03.2014
comment
извините за вопрос, но если мой метод статичен (public static Context getCESDemoAppContext(){ return CESDemoApplication.mContext; }), то зачем мне нужна первая строка, которую вы упомянули (AppClass appclass = ((AppClass) getApplicationContext());) как я уже сохранил контекст в этом классе? - person Sunny; 14.03.2014
comment
Поскольку в этой строке вы не объявляете новый экземпляр AppClass, вы говорите, что хотите привести ApplicationContext (который является классом Application) к вашему AppClass (который является расширением Application). Таким образом, вы фактически говорите, что хотите получить текущий экземпляр AppClass, который содержит ваш Context. Таким образом, вы можете получить контекст с помощью метода getContext(). - person nKn; 14.03.2014
comment
@nKn, я все еще немного смущен этим - person Sunny; 14.03.2014
comment
Взгляните на это: devahead.com/blog/2011/06/ - person nKn; 14.03.2014

Попробуйте использовать этот код:

((Activity) ActivityClass.this).finish();

Помните, что используйте класс Activity, а не Application.

person Faraz Hassan    schedule 13.03.2014
comment
Вы вызываете это из класса активности или приложения? - person Faraz Hassan; 14.03.2014
comment
я вызываю это из функции onResponse, как указано в начальном вопросе - person Sunny; 14.03.2014
comment
Актерский состав здесь довольно избыточен - person Tim; 26.04.2016