Так что у меня проблемы с моими потоками в Android-проекте. У меня есть класс ThreadStarter с функцией BuildScreen(), которая фактически создает макет для каждого вида деятельности. Единственная проблема: иногда потоки просто не запускаются, и я понятия не имею, почему. Они работают как 98% времени, хотя, но когда этого не происходит, текущая активность никогда не будет активизирована, и пользователь должен перезапустить приложение, что неудобно.Андроид иногда не запускается
Вот отрывок из моего кода:
public class ThreadStarter
{
public static void BuildScreen()
{
try
{
GlobalVariables.screenDrawer.onStart();
GlobalVariables.listInitaliser.onStart();
Logger.log("ThreadStarter.BuildScreen", "Threads started");
}
catch(IllegalThreadStateException e)
{
GlobalVariables.screenDrawer.StopThread();
GlobalVariables.listInitaliser.StopThread();
Logger.log("ThreadStarter.BuildScreen", "Threads stopped");
GlobalVariables.screenDrawer.onStart();
GlobalVariables.listInitaliser.onStart();
}
catch(Exception e)
{
Logger.Error("Couldn't stop or start the threads!");
Logger.Error("Exception() Message: " + e.getMessage());
}
}
}
Нити:
public class ListInitialiser extends Thread
{
private static ListInitialiser _thread;
public synchronized void run()
{
GlobalVariables.CurrentActivity.UpdateLists();
}
public void onStart()
{
_thread = new ListInitialiser();
_thread.start();
}
public void StopThread()
{
if (_thread != null)
{
_thread.interrupt();
_thread = null;
}
}
}
Я не буду вставлять нить ScreenDrawer здесь, потому что это в значительной степени то же самое, за исключением того, что вызывает другой функция.
И это, как создается каждый вид деятельности (конечно contentView отличается в каждом файле):
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
getWindow().getAttributes().windowAnimations = R.style.Fade;
setContentView(R.layout.activity_fine_data_3);
GlobalVariables.CurrentActivity = this;
ThreadStarter.BuildScreen();
Logger.log("INFORMATION", "Person3DataActivity (Information 3/5)");
}
В разделе GlobalVariables У меня есть эти переменные:
public static ScreenDrawer screenDrawer = new ScreenDrawer();
public static ListInitialiser listInitaliser = new ListInitialiser();
Если кто-то имеет решения или идеи, пожалуйста, поделитесь им со мной. Спасибо заранее.
EDIT: Хорошо, так что я взял onof (в довольно резкий, но полезный :)) совет и переработан мой код, чтобы использовать вместо AsyncTask. Кажется, он работает очень хорошо. Мне удалось реализовать его в моем классе AbstractActivity, который является родительским элементом каждого действия, которое я использую, и теперь все, что мне нужно сделать, это вызвать метод BuildScreen() в каждом методе onCreate.
Спасибо за ответы всем.
Такой подход кажется мне очень странным. Почему вам нужно инициализировать свои действия таким образом? –
У меня много мероприятий, и я должен был найти стандартное решение для инициализации всех них, не повторяя большую часть моего кода. Кажется, это работает очень хорошо. Кроме того, некоторые из моих действий должны работать с огромным количеством ресурсов (например, с картинками), поэтому мне нужно было загрузить их в фоновом режиме, чтобы поддерживать графический интерфейс. – Rockbag
что не инициализируется ??? Ваша активность или ее никогда не вступают в класс ListInitialiser? – sheetal