如何延迟android的某段代码执行时间

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何延迟android的某段代码执行时间相关的知识,希望对你有一定的参考价值。

我想把android 的ui界面上的多个按钮隐藏,这个操作是在另一个类里面的一个按钮事件操作的。关键是执行时间,我想让这个操作休眠1s后继续进行。试了几次没成功,抛出: 意外停止的信息。
网上有人说用 handler ,不过我没做成功。
哪位大侠知道了,请告知一下,可以的话,给代码示例一下。
angel是个Activity子类
public class Buttondo
private Buttondo(angel al)
initIb(al);
init();

private void initIb(angel al)
allButton[0]=(ImageButton) al.findViewByID(R.id.button1);

private void init()
addBListen();

private void addBListen()

public static Buttondo getBo(angel butterfly)
bo=new Buttondo(butterfly);
return bo;


private void setSOfBn()
在这里实现每间隔1秒时间隐藏一个按钮
for(int i=0; i<all;i++)
Thread.sleep(1000) 之类的,好像要与handler 结合,可以的话帮我实现这个
allButton[i].setVisibility(View.visible);


private class ImageBL implements OnTouchListener
public boolean onTouch(View v, MotionEvent event)
if(event.getAction()==MotionEvent.ACTION_DOWN)
visible=!visible;
setSOfBn();

return false;




要起到延时的作用需要使用Handler。

举例说明:

public class Strobe extends Activity 

    private LinearLayout mLinearLayout;

    private Handler mHander = new Handler();

    private boolean mActive = false;
    private boolean mSwap = true;   

    private final Runnable mRunnable = new Runnable() 

        public void run()          
            if (mActive) 
                if (mSwap)                     
                    mLinearLayout.setBackgroundColor(Color.WHITE);
                    mSwap = false;
                    mHander.postDelayed(mRunnable, 20);
                 else 
                    mLinearLayout.setBackgroundColor(Color.BLACK);
                    mSwap = true;
                    mHander.postDelayed(mRunnable, 100);
                
                       
        
    ;

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mLinearLayout = (LinearLayout) findViewById(R.id.strobe);
        startStrobe();
    

    private void startStrobe()         
        mActive = true;
        mHander.post(mRunnable);
    

代码的意思是:程序创建一个闪光点效果,延时显示:一个是100 ms,其它是20ms。


关于Handler

Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分在消息队列中逐一将消息取出,然后对消息进行处理,也就是发送消息和接收消息不是同步的处理。 这种机制通常用来处理相对耗时比较长的操作。

参考技术A 两个错误
1.开启的新线程不能访问Adroid组建(ui默认为单独,独立的线程)所以外部线程访问组建必须用handler
2.线程方法不应放在方法里,这样写很不规范,最好 :类实现 runnable 重写run()方法,线程放在run()里面

______________________________
run()
for(int i=0; i<all;i++)
tryThread.sleep(1000) 之类的,
提交给handler, 传个参数 i
catch()



外部handler接受参数i
allButton[i].setVisibility(View.visible);本回答被提问者采纳
参考技术B 线程结合handler不可以?什么错误,贴出来看看啊 参考技术C 最好使用runnablejiek

identity与ASP.NET 模拟

默认情况下,ASP.NET应用程序以本机的ASPNET帐号运行,该帐号属于普通用户组,权限受到一定的限制,以保障ASP.NET应用程序运行的安全。但是有时需要某个ASP.NET应用程序或者程序中的某段代码执行需要特定权限的操作,比如某个文件的存取,这时就需要给该程序或相应的某段代码赋予某个帐号的权限以执行该操作,这种方法称之为身份模拟(Impersonation)。

也就是说如果当前IIS的用户在Windows系统中进行某些操作时权限不足,除了可以对IIS用户设置更高的权限外,还可以进行身份模拟,使当前IIS用户具有某个用户的权限。默认情况下模拟的帐户是 IIS APPPOOL\\DefaultAppPool,当然可以进行额外的设置。

通过配置文件

<identity impersonate="true" />

若指定模拟某个用户,则设置userName和password的属性值

<identity impersonate="true" password="" userName="" />

另外也可以通过IIS进行设置

身份验证进去

设置特定的账户

   

在代码中开启

在代码中使用身份模拟更加灵活,可以在指定的代码段中使用身份模拟,在该代码段之外恢复使用ASPNET本机帐号。该方法要求必须使用Windows的认证身份标识。

System.Security.Principal.WindowsImpersonationContext impersonationContext;

impersonationContext = ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();

//Insert your code that runs under the security context of the authenticating user here.

impersonationContext.Undo();

上例中,需要使用Windows身份验证,否则User.Identity不是WindowsIdentity,强制转换会失败然后报错

   

模拟指定账户

 

public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_PROVIDER_DEFAULT = 0;
 
WindowsImpersonationContext impersonationContext; 
 
[DllImport("advapi32.dll", CharSet=CharSet.Auto)]
public static extern int LogonUser(String lpszUserName, 
                                  String lpszDomain,
                                  String lpszPassword,
                                  int dwLogonType, 
                                  int dwLogonProvider,
                                  ref IntPtr phToken);
[DllImport("advapi32.dll", CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
public extern static int DuplicateToken(IntPtr hToken, 
                                  int impersonationLevel,  
                                  ref IntPtr hNewToken);

 

WindowsIdentity tempWindowsIdentity;
   IntPtr token = IntPtr.Zero;
   IntPtr tokenDuplicate = IntPtr.Zero;
 
   if(LogonUser(userName, domain, password, LOGON32_LOGON_INTERACTIVE, 
   LOGON32_PROVIDER_DEFAULT, ref token) != 0)
   {
      if(DuplicateToken(token, 2, ref tokenDuplicate) != 0) 
      {
         tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
         impersonationContext = tempWindowsIdentity.Impersonate();
         if (impersonationContext != null)
            return true;
         else
            return false; 
      }
      else
         return false;
   } 

 

以上代码试过了,鄙人尝试对某个文件设置权限,当前的windows用户可以读写,不知为何模拟管理员身份时则不可读写。体现在未开始模拟时System.IO.File.Exists返回true,而开了模拟之后就false。

以上是关于如何延迟android的某段代码执行时间的主要内容,如果未能解决你的问题,请参考以下文章

js 如何让某段代码只执行一次

identity与ASP.NET 模拟

android中获取某段程序的执行时间

vscode怎么运行代码

保证某段代码在程序的生命周期内只执行一次

c# lambda如何查询指定的条数(就是全部数据的某段数据)