2013-02-10 115 views
3

我的onCreate()活动执行长时间的计算需要一些时间。Android活动需要太长的时间才能显示内容

在相同的onCreate()我调用setContentView()来设置活动的外观。

问题是,由于执行上述计算需要一段时间,Activity的屏幕只有在很长时间后才会加载。

请问,有关如何避免这种情况的任何建议?我试图在onCreate()中调用setContentView(),并在onResume()中开始计算,但活动屏幕再次只在最后加载。

回答

12

没有别的方法可以使用例如一个​​。原因是实际渲染不是异步发生的;换句话说,setContentView将只设置一些数据,但在该时间点上不会显示任何内容。然而,AsyncTask并不一定意味着“长”的计算。但是,如果你的应用程序依赖于结果,并且没有其他计算并行发生,它可能仍然是实现你想要的最简单的方法。如果不是,则可能必须使用线程。

更新既然大家都保持轰击原来的海报更使用的AsyncTask各种质量答案,我想强调一个更多的的AsyncTask是用于操作(时间报价参考:几秒钟最多),而OP已经给出没有指示他的计算真正花费多长时间。另外,一个AsyncTask是一次只能运行一次的对象。

需要考虑的另一个非常重要的问题是以下几点。 Android为AsyncTask分配后台任务优先级。这意味着,除了较低的调度优先级外,AsyncTask中的计算将花费10倍于在前景中执行的计算,因为Android将运行具有后台优先级的所有任务,并具有人工极限为10%的CPU周期。然而,AsyncTasks可以通过提高优先级“仅仅一点点”而从该组中解除。对于的AsyncTask,它会做像这样:

public R doInBackground(I... is) { 
    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND + 
           Process.THREAD_PRIORITY_MORE_FAVORABLE); 
    ... 
} 
+0

我没有听说过有关改变的AsyncTask的线程优先级,感谢教程! – 2014-11-11 19:38:08

2

如果所有的计算需要很长时间来执行,你的UI被“锁定”,而不是更新。

你需要做的所有工作,长期在AsyncTask

的AsyncTask能够正确且容易使用的UI线程。该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。在你开始初始化视图之前onCreate方法

2

调用的setContentView(layoutID),创建一个AsyncTask并开始AsyncTask线程你叫的setContentView只有onCreate方法之后。类似下面

onCreate(....){ 
    -- 
    -- 
    setContentView(layoutID); 
    --- 
    -- 
    new asynchTask(); // load your ui in AsyncTask by creating an inner class in your activity by extending AsyncTask class 

    } 

给出这里是how to implement AsyncTask

1

你必须执行的AsyncTask

public class AsyncTaskActivity extends Activity implements OnClickListener { 
    Button btn; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     btn = (Button) findViewById(R.id.button1);. 
        //because we implement OnClickListener we only have to pass "this" (much easier) 
     btn.setOnClickListener(this); 
    } 

    public void onClick(View view){ 
     //detect the view that was "clicked" 
     switch(view.getId()) 
     { 
      case R.id.button1: 
       new LongOperation().execute(""); 
      break; 

     } 

    } 

    private class LongOperation extends AsyncTask<String, Void, String> { 

      @Override 
      protected String doInBackground(String... params) { 
       for(int i=0;i<5;i++) { 
        try { 
         Thread.sleep(1000); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 

       return "Executed"; 
      }  

      @Override 
      protected void onPostExecute(String result) { 
       TextView txt = (TextView) findViewById(R.id.output); 
       txt.setText("Executed"); // txt.setText(result); 
       //might want to change "executed" for the returned string passed into onPostExecute() but that is upto you 
      } 

      @Override 
      protected void onPreExecute() { 
      } 

      @Override 
      protected void onProgressUpdate(Void... values) { 
      } 
    } 
相关问题