【问题标题】:StackOverFlow Error with ProgressDialog.show() inside AsyncTask While Running Robolectric tests运行 Robolectric 测试时,AsyncTask 中的 ProgressDialog.show() 出现 StackOverFlow 错误
【发布时间】:2016-03-04 05:05:12
【问题描述】:

注意:已经访问过this 链接但没有帮助。

在运行 Robolectric Junit 测试时,我收到由

引起的 StackOverFlow 错误

ProgressDialog.show()

在 AsyncTask 中调用。

我有以下活动:

public abstract class TransactionFragmentActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.transction_layout);             
        SetUpService setup = new SetUpService();
        setup.execute();
    }

    private class SetUpService extends AsyncTask<String, Void, Boolean> {

        private ProgressDialog dialog = new ProgressDialog(TransactionFragmentActivity.this);

        /** progress dialog to show user that the backup is processing. */
        /** application context. */
        @Override
        protected void onPreExecute() {
            SetUpService.this.dialog.setMessage("Please wait");
            SetUpService.this.dialog.setCancelable(false);
            SetUpService.this.dialog.show();
        }

        @Override
        protected Boolean doInBackground(final String... args) {
            // Setting data 
            Log.d(TAG,"doInBackground...");

            fetchData(); //some method doing work
            return true;
        }


        @Override
        protected void onPostExecute(final Boolean success) {
            if (dialog != null && dialog.isShowing()) {
                dialog.dismiss();
            }
        }
    }
}

以下是堆栈跟踪:

java.lang.StackOverflowError 在 java.lang.Class.getConstructor0(未知来源) 在 java.lang.Class.getDeclaredConstructor(未知来源) 在 org.robolectric.bytecode.RobolectricInternals.newInstance(RobolectricInternals.java:39) 在 org.robolectric.bytecode.RobolectricInternals.directlyOn(RobolectricInternals.java:54) 在 org.robolectric.Robolectric.directlyOn(Robolectric.java:366) 在 org.robolectric.shadows.ShadowView.directly(ShadowView.java:439) 在 org.robolectric.shadows.ShadowView.invalidate(ShadowView.java:168) 在 android.view.View.invalidate(View.java) 在 android.widget.TextView.setPadding(TextView.java:2122) 在 android.view.View.recomputePadding(View.java:10914) 在 android.view.View.resolvePadding(View.java:11584) 在 android.view.View.resolveLayoutDirection(View.java:11524) 在 android.view.View.onAttachedToWindow(View.java:11440) 在 android.widget.TextView.onAttachedToWindow(TextView.java:4448) 在 android.view.View.dispatchAttachedToWindow(View.java:11755) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2424) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2424) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2424) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2424) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2424) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2424) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2424) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2424) 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1201) 在 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000) 在 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4214) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 在 android.view.Choreographer.doCallbacks(Choreographer.java:555) 在 android.view.Choreographer.doFrame(Choreographer.java:525) 在 android.view.Choreographer$FrameHandler.handleMessage(Choreographer.java:657) 在 org.robolectric.shadows.ShadowHandler.routeMessage(ShadowHandler.java:125) 在 org.robolectric.shadows.ShadowHandler.access$100(ShadowHandler.java:25) 在 org.robolectric.shadows.ShadowHandler$1.run(ShadowHandler.java:110) 在 org.robolectric.util.Scheduler.postDelayed(Scheduler.java:37) 在 org.robolectric.shadows.ShadowLooper.post(ShadowLooper.java:198) 在 org.robolectric.shadows.ShadowHandler.postDelayed(ShadowHandler.java:56) 在 org.robolectric.shadows.ShadowHandler.sendMessageDelayed(ShadowHandler.java:105) 在 org.robolectric.shadows.ShadowHandler.sendMessageAtTime(ShadowHandler.java:160) 在 android.os.Handler.sendMessageAtTime(Handler.java) 在 android.view.Choreographer.scheduleFrameLocked(Choreographer.java:479) 在 android.view.Choreographer.postCallbackDelayedInternal(Choreographer.java:309) 在 android.view.Choreographer.postCallbackDelayed(Choreographer.java:292) 在 android.view.Choreographer.postCallback(Choreographer.java:266) 在 android.view.ViewRootImpl.scheduleTraversals(ViewRootImpl.java:974) 在 android.view.ViewRootImpl.setLayoutParams(ViewRootImpl.java:792) 在 android.view.WindowManagerImpl.updateViewLayout(WindowManagerImpl.java:343) 在 android.app.Activity.onWindowAttributesChanged(Activity.java:2267) 在 android.view.Window.setDefaultWindowFormat(Window.java:1226) 在 com.android.internal.policy.impl.PhoneWindow.access$1300(PhoneWindow.java:105) 在 com.android.internal.policy.impl.PhoneWindow$DecorView.drawableChanged(PhoneWindow.java:2407) 在 com.android.internal.policy.impl.PhoneWindow$DecorView.fitSystemWindows(PhoneWindow.java:2345) 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1203) 在 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000) 在 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4214) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 在 android.view.Choreographer.doCallbacks(Choreographer.java:555) 在 android.view.Choreographer.doFrame(Choreographer.java:525) 在 android.view.Choreographer$FrameHandler.handleMessage(Choreographer.java:657) 在 org.robolectric.shadows.ShadowHandler.routeMessage(ShadowHandler.java:125) 在 org.robolectric.shadows.ShadowHandler.access$100(ShadowHandler.java:25) 在 org.robolectric.shadows.ShadowHandler$1.run(ShadowHandler.java:110) 在 org.robolectric.util.Scheduler.postDelayed(Scheduler.java:37) 在 org.robolectric.shadows.ShadowLooper.post(ShadowLooper.java:198) 在 org.robolectric.shadows.ShadowHandler.postDelayed(ShadowHandler.java:56) 在 org.robolectric.shadows.ShadowHandler.sendMessageDelayed(ShadowHandler.java:105) 在 org.robolectric.shadows.ShadowHandler.sendMessageAtTime(ShadowHandler.java:160) 在 android.os.Handler.sendMessageAtTime(Handler.java) 在 android.view.Choreographer.scheduleFrameLocked(Choreographer.java:479) 在 android.view.Choreographer.postCallbackDelayedInternal(Choreographer.java:309) 在 android.view.Choreographer.postCallbackDelayed(Choreographer.java:292) 在 android.view.Choreographer.postCallback(Choreographer.java:266) 在 android.view.ViewRootImpl.scheduleTraversals(ViewRootImpl.java:974) 在 android.view.ViewRootImpl.setLayoutParams(ViewRootImpl.java:792) 在 android.view.WindowManagerImpl.updateViewLayout(WindowManagerImpl.java:343) 在 android.app.Activity.onWindowAttributesChanged(Activity.java:2267) 在 android.view.Window.setDefaultWindowFormat(Window.java:1226) 在 com.android.internal.policy.impl.PhoneWindow.access$1300(PhoneWindow.java:105) 在 com.android.internal.policy.impl.PhoneWindow$DecorView.drawableChanged(PhoneWindow.java:2407) 在 com.android.internal.policy.impl.PhoneWindow$DecorView.fitSystemWindows(PhoneWindow.java:2345) 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1203) 在 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000) 在 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4214) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 在 android.view.Choreographer.doCallbacks(Choreographer.java:555) 在 android.view.Choreographer.doFrame(Choreographer.java:525) 在 android.view.Choreographer$FrameHandler.handleMessage(Choreographer.java:657) 在 org.robolectric.shadows.ShadowHandler.routeMessage(ShadowHandler.java:125) 在 org.robolectric.shadows.ShadowHandler.access$100(ShadowHandler.java:25) 在 org.robolectric.shadows.ShadowHandler$1.run(ShadowHandler.java:110) 在 org.robolectric.util.Scheduler.postDelayed(Scheduler.java:37) 在 org.robolectric.shadows.ShadowLooper.post(ShadowLooper.java:198) 在 org.robolectric.shadows.ShadowHandler.postDelayed(ShadowHandler.java:56) 在 org.robolectric.shadows.ShadowHandler.sendMessageDelayed(ShadowHandler.java:105) 在 org.robolectric.shadows.ShadowHandler.sendMessageAtTime(ShadowHandler.java:160) 在 android.os.Handler.sendMessageAtTime(Handler.java) 在 android.view.Choreographer.scheduleFrameLocked(Choreographer.java:479) 在…………

【问题讨论】:

  • 尝试在onPreExecute中初始化ProgressDialog
  • 您的super.onPreExecute();super.onPostExecute(success); 超级子句在哪里。
  • @sourabhbans,在 onPreExecute 中初始化 ProgressDialog 不起作用,super.onPreExecute();和 super.onPostExecute(success);也没有帮助,仍然出现 StackOverFlow 错误。

标签: android junit junit4 robolectric


【解决方案1】:

试试final ProgressDialog dialog = new ProgressDialog(getApplicationContext);

【讨论】:

  • 仍然出现 StackOverFlow 错误。
  • 你找到解决办法了吗?
【解决方案2】:
private ProgressDialog dialog = new ProgressDialog(getActivity());

protected void onPreExecute() { 
    dialog.setMessage("Please wait");
    dialog.setCancelable(false);
    dialog.show();
} 

Activity act = (TransactionFragmentActivity) this;

private ProgressDialog dialog = new ProgressDialog(act);

protected void onPreExecute() { 
    dialog.setMessage("Please wait");
    dialog.setCancelable(false);
    dialog.show();
}

认为它会起作用。看看并告诉我。

【讨论】:

  • Inside SetUpService (AsyncTask) getActivity() is not allowed as per compiler, 也无法将 TransactionFragmentActivity 转换为 Activity。
  • 好的,我很确定将上下文传递给进度对话框是问题所在。我没有答案。请查看该区域。你的异步任务很好。
  • 好的,但代码在 Android Dev Env 中运行,我在 Robolectric 测试用例执行中遇到错误,调用 dialog.show() 方法,所以不知道如何解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
  • 2015-07-17
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
相关资源
最近更新 更多