私は、正しい解決策を見つけることなく、その件について多くの読書をしました。AsyncTaskのキャンセルに関する問題
私はネットワーク探索を行うプログラムを持っています(pingを使用しています)。非同期タスクをどのように停止するのか分かりません。私は仕事をしています。カンケル(真実)が何もしていないようです。その上で私はすぐに真を返すタスクがキャンセルされているかどうかを確認するためにwhile()をやっています。
シーケンス:開始(正常です)私は5-10のIPアドレスを待ち、ボタンストップをクリックします。それから私はスタートをクリックしますが、ディスカバリタスクは実行されません。
私たちは本当に非同期タスクを停止できますか?どうやって?それの遅延は何ですか?
編集
私は迷子になりました。 StackoverflowのすべてのQは、キャンセル(true)がタスクから来る必要があることを示します。
私はdoinbackground内(真の)キャンセルと呼ばれる例がありますが、それはトリガされませんでしたonCancelled
停止が外来なければならない(少なくとも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();
}
}
}
チェックhttp://stackoverflow.com/a/2740204/4854450 –