42

私のAndroidアプリでは、クラスdoInBackgroundを拡張することでいくつかの操作を実行しています。AsyncTask<Void, Void, Void>(私はこのクラスでUIを実行することに意味がありません)

  1. これはAsyncTaskの適切な使用ですか?
  2. もしそうなら、代わりにAsyncTaskを拡張できますか?
  3. AsyncTask拡張との違いは何ですかAsyncTask<Void, Void, Void>

コード例:

public class MessagePooling extends AsyncTask<Void, Void, Void>
{        
    @Override
    protected Void doInBackground(Void... params) 
    {
        while (!isCancelled()) 
        {           
           //Getting data from server            
            SystemClock.sleep(1000);
        }
        return null;
    }
}

または:

public class MessagePooling extends AsyncTask
{
    @Override
    protected Object doInBackground(Object... params) 
    {
        while (!isCancelled()) 
        {           
           //Getting data from server            
            SystemClock.sleep(1000);
        }
        return null;    
    }
}

ありがとう

4

4 に答える 4

57

このAsyncTaskクラスは、非常に便利なスレッド化メカニズムと考えることができます。クリーンアップ操作のキャンセルなど、単純な Java スレッドにはないいくつかのツールを使用できます。バックグラウンドで UI を実行する必要はありません。次のように匿名クラスとして記述することで、単純に実行できます。

    new AsyncTask<Integer, Void, Void>(){
        @Override
        protected Void doInBackground(Integer... params) {
            // **Code**
            return null;
        }
    }.execute(1, 2, 3, 4, 5);

doInBackground指定されたパラメーターを使用して、バックグラウンド スレッドに入力したものを実行します。同様に、パラメータなしで単純に使用Voidおよび実行できます。

この方法でスレッドを実行することの唯一の利点は、将来のメンテナンスを支援することです。UI スレッドに必要な特定のものを変更したい場合があり、その場合は他のメソッドをオーバーライドします。他のケースでは、別のクラスを書き出すことを正当化するのに十分なアクションを実行していないため、その場でクラスを作成して終了するだけです。

編集:

#3 に答えるには: それらは事実上同じです。オブジェクトは、他のVoidオブジェクトと同様に Java オブジェクトです。を使用していないVoidので、その場所で何を使用してもかまいません。コントラクトで 3 つのクラス タイプを渡す必要があるだけAsyncTaskで、デフォルトではObjectこれらがすべてのベースライン クラスです。

于 2012-06-25T18:12:26.350 に答える
16

(このクラスで UI を実行する必要はありません)

次に、スレッドの存続期間中に UI の変更を処理するために設計されたクラスを使用するのThreadではなく、通常のクラスを使用します。AsyncTask

Runnable r = new Runnable()
{
    @Override
    public void run()
    {
        // your code here
    }
};

Thread t = new Thread(r);
t.start();
于 2012-06-25T18:00:27.767 に答える
3

これは AsyncTask の適切な使用ですか?

あなたはあなたの目標が何であるかを言いませんでした。しかし、AsyncTask は通常、長いタスクや作業中に UI を更新するために使用され、長い作業の進行状況の変化を正確に通知します。また、非常に効率的でタイプセーフなツールであり、たとえば Handler よりも複雑です。

AsyncTask と AsyncTask の拡張の違いは何ですか?

AsyncTask はジェネリック型であり、それらと共にジェネリックを使用する必要があります。コードはより高速で、よりタイプセーフです。

UIを実行するのに何の役にも立たない

つまり、どちらかというとHandlerクラシックRunnableインターフェイスを使用でき、基本的にはワーカー スレッドのみで作業できます。


注:一般に、ジェネリック型を使用すると、コードが高速になり、最もタイプ セーフになります。また、次の利点は、ソース コードをコンパイルする際の強力な型チェック、明示的な変換の制限などです。

于 2012-06-25T18:01:30.790 に答える
0
  1. これはasynctaskの適切な使用ですか?

正しい使い方は無いと思います。asynctask を使用して、バックグラウンド スレッドで集中的な操作を実行し、メイン スレッドで結果と更新を発行できます。結果や進捗状況を公開することは必須ではありません。それはあなたに与えられたものです。あなたの決定。

ただし、ネットワーク操作には、スレッドも使用できます。しかし、後で結果と進行状況をメイン スレッドで公開することにした場合、Asynctask が簡単な方法で役立ちます。

スレッドはそうではありません。

Asynctask は、汎用データ型をパラメーターとして使用します。あなたはそれを提供しなければなりません。asyctask からのデータを提供または受け入れたくない場合。Voidタイプを使用できますが、

以下のように

class MessagePooling extends AsyncTask<Void,Void,Void>

これは、asynctask がパラメーターを取得せず、進行状況や結果が得られないことを意味します。

asynctask の詳細: http://androidride.com/beginners-guide-asynctask-android-tutorial-example/

于 2018-07-12T16:47:07.777 に答える