我建议实现一个处理程序回调。您将片段(或活动的)处理程序传递给 AsyncTask,AsyncTask 将在完成后调用该处理程序。异步任务还可以传回任意对象。
下面是一个示例 AsyncTask,我在它自己的文件中(未子类化)中提供它:
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);
}
}
此示例假定您的 AsyncTask 需要一块糖果和一根冰棍。然后,它会将甜点返回到您的片段中。
您可以使用以下命令从片段中的一行中构造并运行 AsyncTask:
( new MyTask( mFragmentHandler, candyCane, grapePop ) ).execute();
但是,当然,您首先需要设置片段的处理程序(myFragmentHandler)。为此,您的片段(或活动)应如下所示(注意“实现 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;
}
}
如果使用这些代码段,按下按钮将触发异步任务。在处理异步任务时,调用片段将继续执行。然后,当 AsyncTask 完成时,它将向片段发送一条消息,指出它已完成,并传递一个包含该消息的对象。此时,片段将看到消息,并执行任何操作。
注意:可能有拼写错误。这是从一个非常大而复杂的代码中切割出来的。