네트워크 검색 프로세스를 구현 중이며 배경 처리 AbstractDiscovery
인 ActivityDiscovery
이라는 활동이 있습니다. 검색이 실행되면 백그라운드 처리로 넘어 가서 처리가 완료 될 때까지 작동합니다. 심지어 내가 다시 버튼을 누르면, 그것은 처리를 멈추지 않습니다. 뒤로 버튼을 누르면 즉시 백그라운드 처리를 중지하도록 구현할 수 있습니까? 내 AbstractDiscovery
도 아래에 나와 있습니다.백그라운드 실행 프로세스를 즉시 중단하는 방법은 무엇입니까?
protected Object doInBackground(Object... x) {
while (/* condition */) {
// work...
if (isCancelled()) break;
}
return null;
}
, 당신의 비동기 작업이 완료 될 때까지 기다렸다가 다시
확인을 할 것입니다 :final public class ActivityDiscovery extends ActivityNet {
private AbstractDiscovery mDiscoveryTask = null;
@Override
public void onCreate(Bundle savedInstanceState) {
}
private void startDiscovering() {
mDiscoveryTask.execute();
}
}
public abstract class AbstractDiscovery extends AsyncTask<Void, HostBean, Void> {
//private final String TAG = "AbstractDiscovery";
protected int hosts_done = 0;
final protected WeakReference<ActivityDiscovery> mDiscover;
protected long ip;
protected long start = 0;
protected long end = 0;
protected long size = 0;
public AbstractDiscovery(ActivityDiscovery discover) {
mDiscover = new WeakReference<ActivityDiscovery>(discover);
}
public void setNetwork(long ip, long start, long end) {
this.ip = ip;
this.start = start;
this.end = end;
}
abstract protected Void doInBackground(Void... params);
@Override
protected void onPreExecute() {
size = (int) (end - start + 1);
if (mDiscover != null) {
final ActivityDiscovery discover = mDiscover.get();
if (discover != null) {
discover.setProgress(0);
}
}
}
@Override
protected void onProgressUpdate(HostBean... host) {
if (mDiscover != null) {
final ActivityDiscovery discover = mDiscover.get();
if (discover != null) {
if (!isCancelled()) {
if (host[0] != null) {
discover.addHost(host[0]);
}
if (size > 0) {
discover.setProgress((int) (hosts_done * 10000/size));
}
}
}
}
}
@Override
protected void onPostExecute(Void unused) {
if (mDiscover != null) {
final ActivityDiscovery discover = mDiscover.get();
if (discover != null) {
if (discover.prefs.getBoolean(Prefs.KEY_VIBRATE_FINISH,
Prefs.DEFAULT_VIBRATE_FINISH) == true) {
Vibrator v = (Vibrator) discover.getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(ActivityDiscovery.VIBRATE);
}
discover.makeToast(R.string.discover_finished);
discover.stopDiscovering();
}
}
}
@Override
protected void onCancelled() {
if (mDiscover != null) {
final ActivityDiscovery discover = mDiscover.get();
if (discover != null) {
discover.makeToast(R.string.discover_canceled);
discover.stopDiscovering();
}
}
super.onCancelled();
}
}
저는 귀하의 아이디어를 구현했으며 효과가 있습니다. – batuman