2017-02-28 6 views
0

私は、正しい解決策を見つけることなく、その件について多くの読書をしました。AsyncTaskのキャンセルに関する問題

私はネットワーク探索を行うプログラムを持っています(pingを使用しています)。非同期タスクをどのように停止するのか分かりません。私は仕事をしています。カンケル(真実)が何もしていないようです。その上で私はすぐに真を返すタスクがキャンセルされているかどうかを確認するためにwhile()をやっています。

シーケンス:開始(正常です)私は5-10のIPアドレスを待ち、ボタンストップをクリックします。それから私はスタートをクリックしますが、ディスカバリタスクは実行されません。

私たちは本当に非同期タスクを停止できますか?どうやって?それの遅延は何ですか?

編集

私は迷子になりました。 StackoverflowのすべてのQは、キャンセル(true)がタスクから来る必要があることを示します。

  1. 私はdoinbackground内(真の)キャンセルと呼ばれる例がありますが、それはトリガされませんでしたonCancelled

  2. 停止が外来なければならない(少なくともforループ)例のほとんどタスク。下の私の例は単にループカウンターで演奏しています。それは動作します。

一つinteristingコメントは、実際の例を持っているのは素晴らしいだろうQ Ideal way to cancel an executing AsyncTask

にwrygielから来ました。

私のコードは変更されましたが、onCancelledは機能しませんでしたので、私はループカウンタで再生します。

public class MainActivity extends AppCompatActivity { 
    TextView text; 
    Discover discover; 
    int count; 
    private boolean running = true; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Button start = (Button) findViewById(R.id.start); 
     Button stop = (Button) findViewById(R.id.stop); 
     text = (TextView) findViewById(R.id.txt); 

     start.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       discover = new Discover(); 
       discover.execute(); 
      } 
     }); 

     stop.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
     //  if(discover != null) 
     //   discover.cancel(true); 
       count = 255; 
      } 
     }); 
    } 

    private class Discover extends AsyncTask<Object, String, Void> { 

     @Override 
     protected Void doInBackground(Object... params) { 
      String ip; 
      Ping ping = new Ping(); 

      for(count=1;count<255;count++) { 
       if(!running) { 
        count = 255; 
        Log.i("Discover", "task terminated"); 
       } 
       ip = "192.168.1." + count; 
       if (!ping.pong(ip)) 
        publishProgress(ip+" not alive "); 
       else 
        publishProgress(ip+" is alive"); 
      } 
      return null; 
     } 

     @Override 
     protected void onPreExecute() { 
      text.setText("Start search..."); 
      super.onPreExecute(); 
     } 

     @Override 
     protected void onProgressUpdate(String... values) { 
      super.onProgressUpdate(values); 
      text.setText(values[0]); 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      text.setText("Task finished"); 
      super.onPostExecute(result); 
     } 

     @Override 
     protected void onCancelled() { 
      running = false; 
      super.onCancelled(); 
     } 

    } 
} 
+2

チェックhttp://stackoverflow.com/a/2740204/4854450 –

答えて

1

このようにasyncTaskを停止することはできません。必要に応じてdiscover.cancel(true);を使用できますが、手動で停止する必要があります。メソッドで値discover.isCancelled()をチェックしてください。そうでない場合は、AsyncTaskdoInBackgroundメソッド全体を呼び出しますが、foはonPostExecuteを経由しません。

0

AsynctaskがonPostExecute()

@Override 
    protected void onCancelled() { 
     super.onCancelled(); 
    } 

ように作り付けのonCancelled()方法を持って、あなたが定期的にasynctaskの状態を確認する必要があり、バックグラウンド機能では、あなたがそれをキャンセルする場合、onCancelled()方法はonPostExecute()の代わりに呼び出されます。