Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android活动显示内容花费的时间太长_Java_Android_Android Activity - Fatal编程技术网

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;我没有听说过更改异步任务的线程优先级,谢谢!