2012-12-05 6 views
2

Так что у меня проблемы с моими потоками в 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.

Спасибо за ответы всем.

+0

Такой подход кажется мне очень странным. Почему вам нужно инициализировать свои действия таким образом? –

+0

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

+0

что не инициализируется ??? Ваша активность или ее никогда не вступают в класс ListInitialiser? – sheetal

ответ

1

попытаться добавить это в класс, где и объявлены глобальные переменные

private static ListInitialiser instance; 
public static synchronized ListInitialiser getInstance() { 
    if (instance == null) 
     instance = new ListInitialiser(); 
    return instance; 
} 

Everytime вы выигрыш, не создавать новые, когда ур принимая static.I не знаю, но может быть это может помочь

0

Вы можете Не полагайтесь на статические переменные, так как все, что является статичным (не окончательным) в Android, можно очистить, когда система нуждается в памяти. Поэтому не ставьте static = storage.

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

public static ScreenDrawer getScreenDrawer() { 
    return new ScreenDrawer(); 
} 

public static ListInitialiser getListInitialiser() { 
    return new ListInitialiser(); 
} 
Смежные вопросы