我的onCreate()活动执行长时间的计算需要一些时间。Android活动需要太长的时间才能显示内容
在相同的onCreate()我调用setContentView()来设置活动的外观。
问题是,由于执行上述计算需要一段时间,Activity的屏幕只有在很长时间后才会加载。
请问,有关如何避免这种情况的任何建议?我试图在onCreate()中调用setContentView(),并在onResume()中开始计算,但活动屏幕再次只在最后加载。
我的onCreate()活动执行长时间的计算需要一些时间。Android活动需要太长的时间才能显示内容
在相同的onCreate()我调用setContentView()来设置活动的外观。
问题是,由于执行上述计算需要一段时间,Activity的屏幕只有在很长时间后才会加载。
请问,有关如何避免这种情况的任何建议?我试图在onCreate()中调用setContentView(),并在onResume()中开始计算,但活动屏幕再次只在最后加载。
没有别的方法可以使用例如一个。原因是实际渲染不是异步发生的;换句话说,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);
...
}
如果所有的计算需要很长时间来执行,你的UI被“锁定”,而不是更新。
你需要做的所有工作,长期在AsyncTask
的AsyncTask能够正确且容易使用的UI线程。该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。在你开始初始化视图之前onCreate方法
你必须执行的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) {
}
}
我没有听说过有关改变的AsyncTask的线程优先级,感谢教程! – 2014-11-11 19:38:08