Java Android活动显示内容花费的时间太长
我在Java Android活动显示内容花费的时间太长,java,android,android-activity,Java,Android,Android Activity,我在onCreate()中的活动执行耗时的长时间计算 在相同的onCreate()中,我调用setContentView()来设置活动的外观 关键是,由于执行上述计算需要一段时间,所以活动的屏幕只会在很长时间后加载 请问,有没有关于如何避免这种情况的建议 我尝试在onCreate()中调用setContentView(),并在onResume()中开始计算,但活动屏幕仅在最后加载 除了使用,没有其他方法。原因是实际渲染不是异步进行的;换句话说,setContentView将只设置一些数据,但在该
onCreate()
中的活动执行耗时的长时间计算
在相同的onCreate()
中,我调用setContentView()
来设置活动的外观
关键是,由于执行上述计算需要一段时间,所以活动的屏幕只会在很长时间后加载
请问,有没有关于如何避免这种情况的建议
我尝试在
onCreate()
中调用setContentView()
,并在onResume()
中开始计算,但活动屏幕仅在最后加载 除了使用,没有其他方法。原因是实际渲染不是异步进行的;换句话说,setContentView将只设置一些数据,但在该时间点不会显示任何内容
然而,AsyncTask并不一定用于“长”计算。但是,如果你的应用程序依赖于结果,并且没有其他计算并行进行,那么它可能仍然是实现你想要的最简单的方法。如果没有,你可能不得不使用线程甚至
更新由于每个人都在不断地炮轰原始海报,大量使用各种质量的AsyncTask答案,我想再次强调,AsyncTask是用于短期操作的(引用参考文献:最多几秒钟),而OP没有给出计算实际需要多长时间的指示。此外,AsyncTask是一个只能运行一次的一次性对象
一个更重要的考虑点如下。Android为AsyncTask分配后台任务优先级。这意味着,除了较低的调度优先级外,AsyncTask中的计算所需时间是在前台执行的计算所需时间的十倍,因为Android以10%CPU周期的人为限制运行所有具有后台优先级的任务。但是,可以通过“稍微”提高优先级将异步任务从该组中移除。对于AsyncTask,可以这样做:
public R doInBackground(I... is) {
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND +
Process.THREAD_PRIORITY_MORE_FAVORABLE);
...
}
如果所有计算都需要很长时间才能执行,则用户界面将被“锁定”且不会更新 你需要在一段时间内完成所有的长时间工作 AsyncTask允许正确且轻松地使用UI线程。此类允许在UI线程上执行后台操作和发布结果,而无需操作线程和/或处理程序。在onCreate方法中调用setContentView(layoutID),在开始初始化视图之前,仅在onCreate方法中调用setContentView之后创建并启动线程。如下所示
onCreate(....){
--
--
setContentView(layoutID);
---
--
new asynchTask(); // load your ui in AsyncTask by creating an inner class in your activity by extending AsyncTask class
}
这是一个关于您必须实现异步任务的教程
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) {
}
}
公共类AsyncTaskActivity扩展活动实现OnClickListener{
按钮btn;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn=(按钮)findViewById(R.id.button1);。
//因为我们实现了OnClickListener,所以我们只需要传递“this”(更简单)
btn.setOnClickListener(此);
}
公共void onClick(视图){
//检测“单击”的视图
开关(view.getId())
{
案例R.id.button1:
新建LongOperation()。执行(“”);
打破
}
}
私有类LongOperation扩展了异步任务{
@凌驾
受保护的字符串doInBackground(字符串…参数){
对于(int i=0;我没有听说过更改异步任务的线程优先级,谢谢!