Tôi sẽ đề xuất triển khai Trình xử lý cuộc gọi xử lý. Bạn sẽ chuyển bộ xử lý (hoặc hoạt động) của đoạn đó cho AsyncTask, AsyncTask sẽ gọi khi nó được hoàn thành. AsyncTask cũng có thể trả về một đối tượng tùy ý.
Dưới đây là một ví dụ AsyncTask, mà tôi có trong tập tin riêng của mình (không 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);
}
}
dụ này giả định rằng AsyncTask của bạn cần một miếng kẹo và một Popsicle.Sau đó, nó sẽ trả lại một món tráng miệng cho mảnh của bạn.
Bạn có thể xây dựng và chạy AsyncTask trong một dòng từ mảnh của bạn với:
(new MyTask(mFragmentHandler, candyCane, grapePop)).execute();
Nhưng tất nhiên, trước tiên bạn sẽ cần phải thiết lập xử lý của đoạn (myFragmentHandler). Để làm điều này, mảnh của bạn (hoặc hoạt động) sẽ giống như thế (chú ý "thực hiện 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;
}
}
Nếu bạn sử dụng các mẩu mã, một nút bấm sẽ kích hoạt AsyncTask. Đoạn gọi sẽ tiếp tục thực thi trong khi AsyncTask đang xử lý. Sau đó, khi AsyncTask kết thúc, nó sẽ gửi một tin nhắn đến đoạn nói rằng nó đã hoàn thành, và truyền một đối tượng với thông báo. Tại thời điểm này, đoạn sẽ thấy thông báo, và làm bất cứ điều gì bạn muốn.
Lưu ý: Có thể có lỗi chính tả. Điều này được cắt từ một mã rất lớn và phức tạp.
Phương thức thực hiện trả về 'AsyncTask' không phải là kết quả. Nếu bạn muốn trả lại một số kết quả từ asyncTask hoặc cung cấp một số dữ liệu, hãy sử dụng [protocol] (http://stackoverflow.com/a/26820666/2835520) – IgniteCoders