5

数秒ごとにいくつかの FTP 処理を実行する必要がある小さな Android アプリケーションがあります。UI スレッドでネットワーク関連の処理を実行することは、Android があまり好まないことであるという難しい方法を学んだ後、私は次の解決策にたどり着きました。

// This class gets declared inside my Activity
private class CheckFtpTask extends AsyncTask<Void, Void, Void> {
    protected Void doInBackground(Void... dummy) {
        Thread.currentThread().setName("CheckFtpTask");
        // Here I'll do the FTP stuff       
        ftpStuff();
        return null;
    }
}

// Member variables inside my activity
private Handler checkFtpHandler;
private Runnable checkFtpRunnable;

// I set up the task later in some of my Activitiy's method:
checkFtpHandler = new Handler();
checkFtpRunnable = new Runnable() {
    @Override
    public void run() {
        new CheckFtpTask().execute((Void[])null);
        checkFtpHandler.postDelayed(checkFtpRunnable, 5000);
    }
};
checkFtpRunnable.run();

UI スレッドで直接実行できない定期的なタスクを実行することは良い習慣ですか? さらに、呼び出して常に新しい AsyncTask オブジェクトを作成する代わりに、

new CheckFtpTask().execute((Void[])null);

CheckFtpTaskオブジェクトを一度作成してから再利用するオプションはありますか? または、それは私に副作用を与えますか?

前もってありがとう、イェンス。

4

3 に答える 3

1

CheckFtpTask オブジェクトを一度作成してから再利用するオプションはありますか? または、それは私に副作用を与えますか?

いいえ、副作用があります。docs を引用するスレッド化ルール:

タスクは 1 回だけ実行できます (2 回目の実行を試みると、例外がスローされます)。

タスクを実行するたびに、タスクの個別のインスタンスを作成するだけで済みます。

Runnableそして、なぜorが必要なのかわかりませんHandler。を更新する必要がある場合、 には(実際には を除くすべて)AsyncTaskで実行されるメソッドがあります。UI ThreaddoInBackground()UI

UIタスクが終了したときに更新するコールバックが必要な場合は、この回答を確認してください。

于 2013-09-13T22:58:10.813 に答える
0

呼び出しごとに新しい非同期タスクを作成する必要があります。

Android のドキュメント: AsyncTaskを参照してください。このドキュメントによると:

タスクは 1 回だけ実行できます (2 回目の実行を試みると、例外がスローされます)。

具体的には、スレッド ルールのセクションを確認してください。ここにも同様の回答があります https://stackoverflow.com/a/18547396/2728623

于 2013-09-13T22:59:05.973 に答える
0

Java ThreadPools と ExecutorFramework を使用すると、必要に応じてスレッドを実行し、スレッド作成のオーバーヘッドを削減できます。singleThreadExecutor を確認してください。スレッドプールの使い方もとても簡単です!

于 2013-09-14T01:24:37.790 に答える