2014-05-25 46 views
-1
package com.example.myapp; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 


    @Override 
    public void onResume() { 
     super.onResume(); 
     sleepForaWhile(); 
    } 

    protected void sleepForaWhile() 
    { 
     try 
     { 
      Thread.sleep(10000); 

     } catch (InterruptedException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

当此活动开始时,我看到一个黑屏(不是活动布局)。然后,布局在10秒后显示,但我希望布局在睡眠代码之前可见。活动布局显示太迟

如何创建此行为?

我试着把onStart()功能的睡眠代码,但没有任何改变。

+0

请注意,onResume()中的代码是在onCreate()中的代码之后执行的,如下所示:http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle –

+0

而不是睡觉该线程创建一个计时器来阻止你的应用程序的功能,但保持线程活着 – zgc7009

回答

1

假设这只是一个例子,(我假设您使用Thread.sleep()来表示任意长时间运行的任务)您需要将Thread.sleep()方法从UI上移开。

直到UI线程上的所有内容都完成后,UI才会返回视图。相反,我们可以使用的AsyncTask

public class DoSomethingTask extends AsyncTask<Void,Void,Void> { 

    private OnCompletionListener listener; 

    // Pass the interface using this method 
    public setOnCompletionListener(OnCompletionListener listener){ 
     this.listener = listener; 
    } 

    protected Void doInBackground(Void... params) { 
     Thread.sleep(10000); 
    } 

    protected void onPostExecute(Void result) { 
     // This will be called after the doInBackground method. 
     // This method is called on the UI thread. 

     // If an instance has been passed, you can access the 
     // onComplete method 
     if (listener != null) { 
      listener.onComplete(); 
     } 
    } 

    // Create an interface 
    public interface OnCompletionListener { 
     void onComplete(); 
    } 
} 

您可以通过书面形式从活动称之为:

DoSomethingTask task = new DoSomethingTask(); 

task.setOnCompletionListener(new OnCompletionListener() { 
    // put the activity methods in here 
}); 

task.execute();` 

这意味着布局将呈现,然后在您的AsyncTask将运行的背景下,做任何你需要它做的事情。如果您愿意,您可以从onPostExecute方法更新布局。

+0

是的,对,它代表了一些其他长期任务。你可以显示使用onPostExecute方法吗? – 1461ts

+0

@ 1461ts你是否在做任何网络操作或阻塞ui线程的任何操作,那么你需要一个线程或者asynctask,否则你不需要那些线程或者asynctask。阅读http://developer.android.com/training/articles/perf-anr.html – Raghunandan

+0

我已经为你更新了这个例子。基本上,如果你想在'onCreate'中写任何需要等待任务完成的东西,你应该将它移动到'onPostExecute'。 – user184994

2

你有

Thread.sleep(10000); 

该块UI线程。切勿阻塞ui线程。请删除sleep()

我不知道为什么你需要延迟。您可以延迟使用Handler。另外onCreate先然后onResume

+0

我知道这个代码,我已经添加了它来进行测试。这只是一个示例代码。我的目标是在布局显示后执行某些操作。 – 1461ts

+0

@ 1461ts因为你不需要睡眠或延迟。只需在'onResume'上做你想做的事 – Raghunandan