簡體   English   中英

Android測試-執行AsyncTask時,活動被意外破壞

[英]Android testing - Activity is destroyed unexpectedly while an AsyncTask is executing

當我運行應用程序本身時,沒有這種行為AsyncTask完成執行后,它將返回到我的MainActivity(從AsyncTask的第一位置開始)。

但是,在我的測試用例中,MainActivity只是突然暫停,停止和銷毀,而AsyncTask只是在短時間內開始執行。

如何確保活動等待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

我的測試課:

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);
}
}  

主要活動

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();
    }

處理器.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)您不應該進行任何UI更改,甚至不顯示Toasts它引發錯誤。

所以mManager.doRegistration(); 如果您執行任何UI更改,都會引發錯誤,

相反,如果有任何UI更改,都可以在protected void onPostExecute()使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM