2017-01-02 75 views
0

我有MainActivityonBackPressed的代码调用,所以当我按下后退按钮时,有一个小动画。执行doInBackground()时只有onCreate发生错误

onBackPressed只有两行:

@Override 
public void onBackPressed() {  
    dialog = new Dialog(MainActivity.this); 
    new animationAsyncTask().execute(); 
} 

这工作得很好。

现在在onCreate相同的活动我试着拨打这一点,所以我删除了上述两条线形成onBackPressed,并呼吁他们onCreate

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    dialog = new Dialog(MainActivity.this); 
    new animationAsyncTask().execute(); 
} 

然后有一个例外:

error java.lang.RuntimeException: An error occured while executing doInBackground() 
带有空指针的

我无法弄清楚的是,我没有改变任何东西,它在onBackPressed中效果不错,但在onCreate中效果不好。

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 
Process: wadinternational.blur, PID: 8821 
java.lang.RuntimeException: An error occured while executing doInBackground() 
at android.os.AsyncTask$3.done(AsyncTask.java:304) 
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
at java.lang.Thread.run(Thread.java:818) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference 
at android.graphics.Bitmap.createBitmap(Bitmap.java:756) 
at android.graphics.Bitmap.createBitmap(Bitmap.java:724) 
at wadinternational.blur.AppUtils.takeScreenShot(AppUtils.java:31) 
at wadinternational.blur.MainActivity$BlurAsyncTask.doInBackground(MainActivity.java:47) 
at wadinternational.blur.MainActivity$BlurAsyncTask.doInBackground(MainActivity.java:42) 
at android.os.AsyncTask$2.call(AsyncTask.java:292) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)  
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)  
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)  
at java.lang.Thread.run(Thread.java:818) 
+0

报告崩溃时发布完整堆栈跟踪。 –

+0

@Gabe Sechan是的,我知道但我必须把所有与他们联系的类,这就是为什么我把它以这种方式..我会更新问题。但事情是我没有改变任何其他单行除了这两行从onBack到onCreate –

+0

问题是在AsyncTask上,所以请显示代码 – Gatunox

回答

0

我有一个建议,

如果被调用onBackPressed但不onCreate其具有较高的变化,那是因为你的进程仍在加载..所以作为@Gatunox建议你需要等待和执行活动后准备好!

你可以试试这个

使用AsyncTask和显示的等待或者什么东西其加载显示您的动画。

onCreatenew waitTillYouLoadData().execute();

调用此AsyncTask希望它能帮助!

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

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

     protected void onPreExecute() { 
      this.dialog.setMessage(getResources().getString(
        R.string.plase_wait)); 
      this.dialog.show(); 
     } 

     protected Boolean doInBackground(final String... args) { 
      try { 



       return true; 
      } catch (Exception e) { 
       Log.e("tag", "error", e); 
       return false; 
      } 
     } 

     @Override 
     protected void onPostExecute(final Boolean success) { 

      if (dialog.isShowing()) { 
       dialog.dismiss(); 
      } 

      if (success) { 
       // ------- HERE YOU CAN CALL YOU ANIMATION -----// 

      } 
     } 
    } 
+0

谢谢它的工作:) –

0

所以这里是我的猜测。

您执行的动画是某种BLUR效果。由于android没有像iOS那样的功能。许多程序员试图模仿捕捉屏幕截图的效果,然后在捕捉的实际图像上应用模糊效果。

所以可能会猜测是您在屏幕捕获时执行的方式,或者onCreate和onStart导致错误时屏幕未显示的事实。

如果你想证明它只是在调用这个“动画”之前使用某种延迟寻找CountDownTimer或使用FULLSCREEN模板在android studio中创建一个新项目,并检查它如何延迟代码的执行lo隐藏UI并在您的项目中使用。

祝你好运。

+0

我不是说他应该这样做,他需要解决原来的问题,我的两个例子只是快速的方法来证明我的理论。 – Gatunox

0

你不要张贴你在AsyncTask做什么,但它看起来像你可能需要等到布局绘制,使用ViewTreeObserver

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ViewTreeObserver vto = getWindow().getDecorView().getViewTreeObserver(); 
     vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() 
     { 
      @Override 
      public void onGlobalLayout() 
      { 
       dialog = new Dialog(MainActivity.this); 
       new animationAsyncTask().execute(); 
       getWindow().getDecorView().getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      } 
     }); 

    } 

你会如果您正在使用< API 16,则需要一些其他逻辑。

相关问题