So beenden Sie einen AsyncTask in einem Fragment, nachdem die Anwendung geschlossen wird
Wie zu stoppen AsyncTask in fragment-Klasse nach der Anwendung schließen.
Hier ist meine situation:
MainActivity-Klasse
public class MainActivity extends FragmentActivity {
}
BaseFragment Klasse erweitert durch das Fragment
public class BaseFragment extends Fragment {
public MainActivity mActivity;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mActivity = (ChatActivity)this.getActivity();
}
public boolean onBackPressed(){
return false;
}
public void onActivityResult(int requestCode, int resultCode, Intent data){
}
@Override
public void onDestroy() {
//TODO Auto-generated method stub
super.onDestroy();
}
}
Fragment-Klasse
public class Fragment1 extends BaseFragment{
private Update task;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
toCallAsynchronous();
return inflater.inflate(R.layout.activity_online_korisnici, container,
false);
}
public void toCallAsynchronous() {
final Handler handler = new Handler();
Timer timer = new Timer();
TimerTask doAsynchronousTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
try {
task =new Update();
//PerformBackgroundTask this class is the class that extends AsynchTask
task.execute("");
} catch (Exception e) {
//TODO Auto-generated catch block
}
}
});
}
};
timer.schedule(doAsynchronousTask, 0, 5000); //execute in every 50000 ms
}
private class Update extends AsyncTask<Object, Object, List<Object>>{
@Override
protected List<Object> doInBackground(Object... params) {
}
@Override
protected void onPostExecute(List<Object> result) {
}
}
}
Ich denke, das kann man in MainActivity->onPause () Methode, aber wie.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie onPause () - Methode des Fragment. Es wird aufgerufen, wenn das Fragment ist nicht mehr wieder. Dies ist in der Regel gebunden an die Aktivität.onPause der mit Activity-Lebenszyklus.
Update:
Wenn Sie unter TabHost, und das Fragment wird angehalten, wenn Sie gedrückt werden verschiedene Registerkarten, die Sie tun könnten, so
store-fragment-IDS oder tags in Ihre Tätigkeit
implementieren Sie eine Methode zum beenden der Aufgabe in Ihre Fragmente
In Ihrer Aktivität onPause()
Aber ich würde nicht mit TabHost ist sowieso veraltet. Erwägen Sie die Verwendung ActionBar, oder ActionBarSherlock, wenn Sie benötigen support v4 Versionen.
task.cancel()
wird es tun. Werden Sie sicher, dass häufige Kontrollen zuisCancelled()
in IhremonBackground()
sowie inonPostExecute()
zu vermeiden, den Zugriff/Aktualisierung der UI, die ist nicht mehr da.onDestroy()
möglicherweise inonDetach()
.Ich hatte ein ähnliches problem - im Grunde war ich immer eine NPE in einer async-task, nachdem der Benutzer hatte zerstört die Aktivität. Nach der Forschung das problem auf Stack Overflow, nahm ich die folgende Lösung:
boolean running;
public void onActivityCreated (Bundle savedInstanceState) {
Dann, ob ich "wenn Sie laufen" regelmäßig in meine async-code. Ich habe stress getestet und ich bin jetzt nicht in der Lage zu "brechen" meiner Tätigkeit. Dieser funktioniert einwandfrei und hat den Vorteil, dass Sie einfacher und weniger fehleranfällig als einige der Lösungen, die ich gesehen habe auf SO.