Ich würde vorschlagen, einen Handler Callback zu implementieren. Sie würden den Handler des Fragments (oder der Aktivität) an die AsyncTask übergeben, die die AsyncTask aufrufen wird, wenn sie beendet ist. Die AsyncTask kann auch ein beliebiges Objekt zurückgeben. Hier
ist ein Beispiel AsyncTask, die ich in einer eigenen Datei (nicht subclassed):
public class MyTask extends AsyncTask<Void, String, String> {
private static final String TAG = "MyTask";
private Handler mCallersHandler;
private Candy mObject1;
private Popsicle mObject2;
// Return codes
public static final int MSG_FINISHED = 1001;
public SaveVideoTask(Handler handler, Candy candyCane, Popsicle grapePop) {
this.mCallersHandler = handler;
this.mObject1 = candyCane;
this.mObject2 = grapePop;
}
@Override
protected String doInBackground(Void... params) {
// Do all of the processing that you want to do...
// You already have the private fields because of the constructor
// so you can use mObject1 and mObject2
Dessert objectToReturn = mObject1 + mObject2;
// Tell the handler (usually from the calling thread) that we are finished,
// returning an object with the message
mCallersHandler.sendMessage(Message.obtain(mCallersHandler, MSG_FINISHED, objectToReturn));
return (null);
}
}
Dieses Beispiel geht davon aus, dass Ihr AsyncTask ein Stück Süßigkeit benötigt und ein Eis am Stiel.Dann wird ein Dessert zu deinem Fragment zurückgegeben.
Sie können die AsyncTask in einer Zeile aus dem Fragment konstruieren und laufen mit:
(new MyTask(mFragmentHandler, candyCane, grapePop)).execute();
Aber natürlich werden Sie zunächst das Fragment Handler (myFragmentHandler) einrichten müssen. Um dies zu tun, sollte Ihr Fragment (oder Aktivität) aussehen (man beachte die „implementiert Handler.Callback“):
public class MyFragment extends Fragment implements Handler.Callback {
private Handler mFragmentHandler;
private Candy candyCane;
private Popsicle grapePop;
@Override
public void onCreate(Bundle savedInstanceState) {
// Standard creation code
super.onCreate(savedInstanceState);
setRetainInstance(true);
// Create a handler for this fragment
mFragmentHandler = new Handler(this);
// Other stuff...
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent,
Bundle savedInstanceState) {
// Inflate the layout
View v = inflater.inflate(R.layout.my_fragment_layout, parent, false);
// The candyCane and grapePop don't need to be set up here, but
// they MUST be set up before the button is pressed.
// Here would be a good place to at least initialize them...
// Perhaps you have a button in "my_fragment_layout" that triggers the AsyncTask...
Button mButton = (Button) v.findViewById(R.id.mButton);
mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
(new MyTask(mFragmentHandler, candyCane, grapePop)).execute();
}
});
return v;
}
@SuppressWarnings("unchecked")
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case MyTask.MSG_FINISHED:
// Let's see what we are having for dessert
Dessert myDessert = (Dessert) msg.obj;
break;
}
return false;
}
}
Wenn Sie diese Teile des Codes zu verwenden, eine Taste drücken Sie die AsyncTask auslösen. Das aufrufende Fragment wird weiterhin ausgeführt, während die AsyncTask verarbeitet. Wenn die AsyncTask beendet ist, sendet sie eine Nachricht an das Fragment, dass sie beendet ist, und übergibt ein Objekt mit der Nachricht. An diesem Punkt wird das Fragment die Nachricht sehen und tun, was Sie wollen.
Hinweis: Es kann Tippfehler geben. Dies ist aus einem sehr großen und komplizierten Code geschnitten.
Die Methode execute gibt die 'AsyncTask' nicht als Ergebnis zurück. Wenn Sie ein Ergebnis aus der asyncTask zurückgeben oder Daten bereitstellen möchten, verwenden Sie [protocols] (http://stackoverflow.com/a/26820666/2835520) – IgniteCoders