Tôi biết điều này đã được một thời gian trước đây, và bạn đã giải quyết vấn đề của bạn. nhưng tôi chỉ có một vấn đề tương tự. Đề nghị của Reno đã đưa tôi đi đúng hướng, nhưng đối với những người đã thấy khó khăn để lấp đầy khoảng trống. Đây là cách tôi vượt qua một vấn đề tương tự như của katit.
Tôi muốn một AsyncTask cụ thể chỉ chạy nếu nó hiện không chạy. Và như một sự chuyển tiếp từ gợi ý của Reno, giao diện AsyncTask đã được tạo ra để xử lý tất cả các quá trình gritty nitty trong việc xử lý đúng đắn các luồng cho Android. Có nghĩa là, Executor được tích hợp. Vì điều này blog gợi ý:
"Khi thực thi (Object .. params) được gọi trên AsyncTask, nhiệm vụ được thực hiện trong một chủ đề nền. Tùy thuộc vào nền tảng AsyncTasks có thể được thực hiện serially (trước 1.6 và có khả năng một lần nữa trong 4+), hoặc đồng thời (1.6-3.2)
Để đảm bảo chạy liên tục hoặc đồng thời như bạn yêu cầu, từ Cấp 11 trở đi, bạn có thể sử dụng executeOnExecutor (Trình thực thi Executor, Object) .. params) thay vào đó, và cung cấp một trình thực thi, nền tảng này cung cấp hai trình thực thi để thuận tiện, có thể truy cập như AsyncTask.SERIAL_EXECUTOR và AsyncTask.THREAD_POOL_EXECUTOR tương ứng. "
Vì vậy, với điều này trong tâm trí, bạn có thể làm chủ đề chặn thông qua giao diện AsyncTask, nó cũng ngụ ý bạn chỉ có thể sử dụng AsyncTasks.getStatus() để xử lý chủ đề chặn, như DeeV gợi ý trên post này.
trong mã của tôi, tôi quản lý này bằng cách:
Tạo một biến toàn cầu định nghĩa là:
private static AsyncTask<String, Integer, String> mTask = null;
Và trong onCreate, initialising nó như là một thể hiện của AsyncTask tôi gọi CalculateSpecAndDraw:
mTask = new CalculateAndDrawSpec();
Bây giờ khi đã bao giờ tôi muốn gọi AsyncTask này tôi bao quanh thực hiện như sau:
if(mTask.getStatus() == AsyncTask.Status.FINISHED){
// My AsyncTask is done and onPostExecute was called
mTask = new CalculateAndDrawSpec().execute(Integer.toString(progress));
}else if(mTask.getStatus() == AsyncTask.Status.PENDING){
mTask.execute(Integer.toString(progress));
}else{
Toast.makeText(PlaySpecActivity.this, "Please Wait..", 1000).show();
}
này sinh ra một chuỗi mới, nếu nó được hoàn tất, hoặc nếu tình trạng chủ đề đang chờ, các thread được định nghĩa nhưng chưa được bắt đầu, chúng ta bắt đầu nó. Nhưng nếu không, nếu thread đang chạy, chúng tôi không chạy lại nó, chúng tôi chỉ đơn giản là thông báo cho người dùng rằng nó không được hoàn thành, hoặc thực hiện những gì bao giờ hành động chúng tôi muốn. Sau đó, nếu bạn muốn lên lịch sự kiện tiếp theo thay vì chỉ chặn sự kiện tiếp theo, hãy xem tài liệu this về cách sử dụng các nhà thi hành.
Tôi sợ rằng nếu tôi sử dụng cờ trong ứng dụng và AsyncTask của tôi không thành công vì lý do nào đó - nó sẽ không bao giờ thực hiện lại vì cờ đã cho thấy nó bắt đầu – katit