そのため、Android プロジェクトのスレッドに問題があります。各アクティビティのレイアウトを実際に作成する BuildScreen() 関数を備えた ThreadStarter クラスがあります。唯一の問題は、スレッドが開始されないことがあり、その理由がわかりません。ただし、それらは 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();
誰かが解決策やアイデアを持っている場合は、私と共有してください。前もって感謝します。
編集: わかりましたので、onof の (かなり厳しいが役に立つ :)) アドバイスを受け、代わりに AsyncTask を使用するようにコードをリファクタリングしました。それはかなりうまくいっているようです。使用するすべてのアクティビティの親である AbstractActivity クラスにそれを実装することができたので、すべての onCreate メソッドで BuildScreen() メソッドを呼び出すだけです。
返信ありがとうございます。