2

そのため、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() メソッドを呼び出すだけです。

返信ありがとうございます。

4

2 に答える 2

1

uがグローバル変数を宣言したクラスにこれを追加してみてください

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

静的なものを取得するたびに、新しいものを作成する必要はありません。わかりませんが、これが役立つ場合があります

于 2012-12-05T09:57:33.473 に答える
0

システムがメモリを必要とするときはいつでも、Android で静的な (非最終的な) ものはすべてクリアできるため、静的変数に依存することはできません。したがって、静的 = ストレージとは考えないでください。

代わりに、次のように、必要に応じてオブジェクトをインスタンス化する必要があります。

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

public static ListInitialiser getListInitialiser () {
    return new ListInitialiser ();
}
于 2012-12-05T10:08:18.183 に答える