[英]Android testing - Activity is destroyed unexpectedly while an AsyncTask is executing
When I run the app itself, there is no such behaviour - once AsyncTask
finishes executing, it returns to my MainActivity (from where the AsyncTask
was started in the 1st place). 当我运行应用程序本身时,没有这种行为AsyncTask
完成执行后,它将返回到我的MainActivity(从AsyncTask
的第一位置开始)。
However, in my test case, the MainActivity is just suddenly paused, stopped and destroyed while the AsyncTask
just started executing for a short time. 但是,在我的测试用例中,MainActivity只是突然暂停,停止和销毁,而AsyncTask
只是在短时间内开始执行。
How do I make sure that the activity waits for the AsyncTask
to call it back just like how my app really behaves? 如何确保活动等待AsyncTask
对其进行回调,就像我的应用程序的实际行为一样?
02-21 17:23:13.063: W/MainActivity(16685): onCreate
02-21 17:23:13.133: W/MainActivity(16685): refreshRequired
02-21 17:23:13.233: W/MainActivity(16685): user is not regitered
02-21 17:23:13.233: W/MainActivity(16685): onStart
02-21 17:23:13.233: W/MainActivity(16685): onResume
02-21 17:23:16.686: W/MainActivityFunctionalTest(16685): performing the button click action
02-21 17:23:17.227: W/MainActivity(16685): Submit button is clicked
02-21 17:23:17.377: W/Process(16685): doInBackground
02-21 17:23:17.377: W/RegistrationManager(16685): doRegistration
02-21 17:23:17.387: W/RegistrationManager(16685): sendJobRequest
02-21 17:23:17.487: W/RegistrationManager(16685): didOpenedAPDUConnection
02-21 17:23:17.507: W/MainActivity(16685): onPause
02-21 17:23:17.617: W/RegistrationManager(16685): sending HTTP request
02-21 17:23:17.617: W/MessageProcessor(16685): sending a HTTP request
02-21 17:23:17.627: W/HTTPRequest(16685): HTTPRequest.startAsynchronous timeout : 60000
02-21 17:23:17.627: W/HTTPRequest(16685): url is: ...
02-21 17:23:17.848: W/HTTPRequest(16685): HTTPRequest.readResponse RESP BODY = ca000000250104313030350218437573746f6d657220646f6573206e6f74206578697374210900000000
02-21 17:23:17.848: W/MessageProcessor(16685): requestFinished
02-21 17:23:17.858: W/RegistrationManager(16685): didFailedJobRequestWithResponseMsg
02-21 17:23:17.898: W/Process(16685): onPostExecute
02-21 17:38:29.057: W/MainActivity(17483): onStop
02-21 17:38:29.057: W/MainActivity(17483): onDestroy
My test class: 我的测试课:
public class MainActivityFunctionalTest extends
ActivityInstrumentationTestCase2<MainActivity> {
public void testRegistrationFormIsSubmitted() {
final MainActivity mainActivity = (MainActivity) solo
.getCurrentActivity();
solo.assertCurrentActivity("current activity not main activity",
MainActivity.class);
final View submitBtn = solo.getView(R.id.btn_next);
assertNotNull(submitBtn);
Log.w(TAG, "performing the button click action");
solo.clickOnView(submitBtn);
}
}
MainActivity 主要活动
ImageButton submitBtn = (ImageButton) findViewById(R.id.btn_next);
submitBtn.setImageResource(R.drawable.btn_submit);
// View submitBtn = findViewById(R.id.btn_next);
submitBtn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Log.w(TAG, "Submit button is clicked");
sendActivation(v);
}
});
private void sendActivation(View v) {
process = new Processor(this, this.getApplicationContext());
process.execute();
}
Processor.java 处理器.java
public class Processor extends AsyncTask<Void, String, Void>{
@Override
protected Void doInBackground(Void... arg0)
{
Log.w(TAG, "doInBackground");
mManager.doRegistration();
return null;
}
}
protected Void doInBackground(Void... arg0)
you should not do any UI changes not even displaying Toasts
it throws error. protected Void doInBackground(Void... arg0)
您不应该进行任何UI更改,甚至不显示Toasts
它引发错误。
So mManager.doRegistration();
所以mManager.doRegistration();
if you are performing any UI changes, it will throw error, 如果您执行任何UI更改,都会引发错误,
Instead you can use it in protected void onPostExecute()
if any UI changes are there. 相反,如果有任何UI更改,都可以在protected void onPostExecute()
使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.