繁体   English   中英

Android中Thread.sleep方法的替代方法

[英]Alternative to Thread.sleep method in Android

我有一个按钮,当单击该按钮时,将在我的文本字段中输入的详细信息保存到Google App Engine,在该onClickListener调用之后,我立即启动了一个新活动,该活动将显示我刚刚输入的详细信息。 这是此代码:

submitButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(v.getId() == R.id.userDetailsCaptureButton) {
                new EndpointsTask().execute(getApplicationContext());
            }

            startActivity(userProfileDisplayIntent);
        }
    });

现在,我希望能够在调用new EnpointsTask().execute(getApplicationContext)之后调用startActivity之前等待几秒钟。 我读到使用Thread.sleep会导致UI冻结,因此这不是最适合此方法。 还有什么其他选择?

解决方案是使用具有可运行性的处理程序,并使用方法“ postDelayed”。 例:

new Handler().postDelayed(new Runnable() {
    public void run () {
        // Do delayed stuff!
    }
}, 5000L); //5 seconds delay 

开始活动于

onPostExecute()

EndpointsTask

您的EndPoints任务应如下所示

public final class EndpointsTask extends AsyncTask {

    private final Intent mUserProfileDisplayIntent;
    private final WeakReference<Activity> mActivityReference;

    EndpointsTask(final Activity activity, final Intent userProfileDisplayIntent) {
        mActivityReference = new WeakReference<Activity>(activity);
        mUserProfileDisplayIntent = userProfileDisplayIntent;
    }

    @Override
    protected void onPostExecute(Void result) {
        final Activity activity = mActivityReference.get();
        if (activity != null) {
            startActivity(mUserProfileDisplayIntent);
        }
    }
}

接着

    @Override
    public void onClick(View v) {
        if(v.getId() == R.id.userDetailsCaptureButton) {
            // make sure only one task can be launched
            if (endPointsTask == null || endPointsTask.getStatus() != AsyncTask.Status.RUNNING) {
                 endPointsTask = new EndpointsTask(YourActivity.this);
                 endPointsTask.execute();
            }
        }
        startActivity(userProfileDisplayIntent);
    }

// always cancel AsyncTasks in onStop(). You don't want it to launch anything when minimized, do you?

@Override
protected void onStop() {
    super.onStop();
    if (endPointsTask != null && endPointsTask.getStatus() == AsyncTask.Status.RUNNING) {
        endPointsTask.cancel();
    }
}

不要将Context作为参数传递给任何线程,因为它可能导致泄漏。 这也意味着内部类应该是静态的。 将上下文存储为WeakReference(在当前示例中将mActivityReference用于Context)

尝试使用Handler和onClick内部的postDelayed方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM