#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 тоже стоит инвестировать.