2016-03-19 58 views
-1

我正在使用ASyncTask在我的应用程序中执行简单的动画。但它只适用于Android 5.0+,低于它只是崩溃,并说我从错误的线程编辑UI。这里是我的代码:Android ASyncTask在Android 4及以下崩溃

private class AlphaCorrect extends AsyncTask<Integer, Integer, Integer> { 
    float alpha; 
    @Override 
    protected Integer doInBackground(Integer[] params) { 
     Log.i("back","running"); 
     for (float i = 0.0f; i < 0.9; i += 0.02) { 
      alpha = i; 
      try { 
       Thread.sleep(10); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      Update(); 
     } 
     try { 
      Thread.sleep(100); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     for (float i = 0.8f; i > -0.1f; i -= 0.02) { 
      alpha = i; 
      try { 
       Thread.sleep(10); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      Update(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPreExecute() { 
     Log.i("run", "RUN"); 
     canClick = false; 
    } 

    @Override 
    protected void onPostExecute(Integer result) { 
     canClick = true; 
    } 

    protected void Update() { 
     correct.setAlpha(alpha); 
    } 
} 

我试过RunnableThread和其他一些东西了。有任何想法吗?

+0

logcat好吗?显示确切的错误信息。 –

+0

我想知道它在Android 5.0+上的工作原理。您确实不允许使用除main之外的任何线程对UI执行任何操作。每当你需要更新UI时,只需在*主线程*上发布一个Runnable(如果系统没有为你提供回调)。 – frangulyan

回答

1

你完全可以做错误说的 - 你从另一个线程更新UI。覆盖的AsyncTask的onProgressUpdate方法,把Update()里面并调用publishProgress(0)在doInBackground方法

+0

我这样做,它是一样的。相同的错误消息。 – BeefEX

0

任何的AsyncTask的背景下,你不能从编辑了活动的任何用户界面。这就是为什么你得到这个错误。您可以从doinbackground编辑的值是本地可调参数和全局可用参数。

你不能从doInBackground()编辑ui。

sloution将使用onProgressUpdate()并且执行onpogressupdate()中的ui更改。

让我知道这是你想要的。

0

它就像他们说的。你不能更新你的Update()中的任何东西,你应该使用onProgressUpdate(),这个方法由AsynTask提供。