Tôi có một ví dụ triển khai AsyncTask rất đơn giản và đang gặp sự cố khi kiểm tra nó bằng khung Android JUnit.
Nó hoạt động tốt khi tôi khởi tạo và thực thi nó trong ứng dụng bình thường. Tuy nhiên, khi nó được thực thi từ bất kỳ lớp khung kiểm tra Android nào (ví dụ: AndroidTestCase , ActivityUnitTestCase , ActivityIusalmentationTestCase2 , v.v.) nó hoạt động kỳ lạ:
- Nó thực thi
doInBackground()
phương pháp một cách chính xác - Tuy nhiên nó không gọi bất kỳ phương pháp thông báo của nó (
onPostExecute()
,onProgressUpdate()
, vv) - chỉ âm thầm bỏ qua chúng mà không hiển thị bất kỳ lỗi nào.
Đây là ví dụ AsyncTask rất đơn giản:
package kroz.andcookbook.threads.asynctask;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ProgressBar;
import android.widget.Toast;
public class AsyncTaskDemo extends AsyncTask<Integer, Integer, String> {
AsyncTaskDemoActivity _parentActivity;
int _counter;
int _maxCount;
public AsyncTaskDemo(AsyncTaskDemoActivity asyncTaskDemoActivity) {
_parentActivity = asyncTaskDemoActivity;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
_parentActivity._progressBar.setVisibility(ProgressBar.VISIBLE);
_parentActivity._progressBar.invalidate();
}
@Override
protected String doInBackground(Integer... params) {
_maxCount = params[0];
for (_counter = 0; _counter <= _maxCount; _counter++) {
try {
Thread.sleep(1000);
publishProgress(_counter);
} catch (InterruptedException e) {
// Ignore
}
}
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
int progress = values[0];
String progressStr = "Counting " + progress + " out of " + _maxCount;
_parentActivity._textView.setText(progressStr);
_parentActivity._textView.invalidate();
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
_parentActivity._progressBar.setVisibility(ProgressBar.INVISIBLE);
_parentActivity._progressBar.invalidate();
}
@Override
protected void onCancelled() {
super.onCancelled();
_parentActivity._textView.setText("Request to cancel AsyncTask");
}
}
Đây là một trường hợp thử nghiệm. Ở đây AsyncTaskDemoActivity là một Hoạt động rất đơn giản cung cấp giao diện người dùng để kiểm tra AsyncTask ở chế độ:
package kroz.andcookbook.test.threads.asynctask;
import java.util.concurrent.ExecutionException;
import kroz.andcookbook.R;
import kroz.andcookbook.threads.asynctask.AsyncTaskDemo;
import kroz.andcookbook.threads.asynctask.AsyncTaskDemoActivity;
import android.content.Intent;
import android.test.ActivityUnitTestCase;
import android.widget.Button;
public class AsyncTaskDemoTest2 extends ActivityUnitTestCase<AsyncTaskDemoActivity> {
AsyncTaskDemo _atask;
private Intent _startIntent;
public AsyncTaskDemoTest2() {
super(AsyncTaskDemoActivity.class);
}
protected void setUp() throws Exception {
super.setUp();
_startIntent = new Intent(Intent.ACTION_MAIN);
}
protected void tearDown() throws Exception {
super.tearDown();
}
public final void testExecute() {
startActivity(_startIntent, null, null);
Button btnStart = (Button) getActivity().findViewById(R.id.Button01);
btnStart.performClick();
assertNotNull(getActivity());
}
}
Tất cả mã này đều hoạt động tốt, ngoại trừ thực tế là AsyncTask không gọi các phương thức thông báo của nó khi được thực thi bởi trong Khung thử nghiệm Android. Bất kỳ ý tưởng?
Service.doSomething()
gì?