Не удается получить контекст для запуска намерения

#android #android-intent #null #android-context

#Android #android-намерение #null #android-контекст

Вопрос:

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

 public class ToLaunch extends Activity {
    public void launchScoreloop() {
        con.getApplicationContext();
        startActivity(new Intent(this, LeaderboardsScreenActivity.class));
    }
}
  

Комментарии:

1. Не могу получить вас вообще, и это неправильный способ запуска нового намерения …. пожалуйста, приведите несколько простых примеров Android..

2. Возможно, вы захотите прочитать это

Ответ №1:

Вы пишете действие, и вы не переопределили метод onCreate() .

 public class ToLaunch extends Activity {
    @override
    protected void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
     //Call your method here after a  button click cor example or something else
    }

    public void launchScoreloop() {
        con.getApplicationContext();
        startActivity(new Intent(this, LeaderboardsScreenActivity.class));
    }
}
  

обратитесь к этим двум руководствам об использовании намерений для запуска другого действия :
tuto 1
tuto 2

И если вы хотите запустить действие из другого класса, вы должны передать контекст второму классу следующим образом :

 SecondClass instance = new SecondClass(this);
  

и конструктор вашего второго класса будет примерно таким :

 public void SecondClass(Context _context){
   this.context = _context;
}
  

и затем вы можете запустить Avtivity, используя контекст, который вы передали своему второму классу следующим образом :

 this.context.startActivity(....);
  

Комментарии:

1. Вероятно, мне не следовало расширять активность, это было только для того, чтобы я мог использовать startActivity(). То, что я искал, было простым — запустить намерение из потока, которому не передан контекст.

Ответ №2:

Если thread является внутренним классом внутри вашей активности, вы можете использовать

     startActivity(new Intent(YourActivity.this, LeaderboardsScreenActivity.class));

    If it is a separate class you can make a constructor that take context has constructor as argument and you can pass your activity context into that constructor


    Context con;
    public YourThread(Context context){
     con = context;
    }
  

и изнутри вашей активности, при создании объекта потока

     YourThread thread = new YourThread(this);
  

Комментарии:

1. Обычно не рекомендуется передавать контекст другим потокам, чтобы избежать долгой жизни вашей активности и утечки памяти. При этом вам лучше использовать WeakReference<> для сохранения контекста.

2. Спасибо за информацию. Но что, если мы создадим контекст в качестве слабой ссылки, и он соберет мусор до того, как поток его использует. Это приведет к сбою приложения, поскольку контекст равен нулю

3. лучше использовать AsynTask для запуска лечения, которое изменит пользовательский интерфейс 🙂

4. @anujprashar Вы можете проверить, содержит ли WeakReference<> по-прежнему действительную ссылку на контекст (.get() возвращает null) и избегать каких-либо действий с ним. Предложение Houcine тоже стоит инвестировать.