java - AsyncTask 中的 Runnable 是否会阻止服务/Activity ?它对我有用

标签 java android multithreading android-asynctask runnable

我有一项服务执行大量耗时的计算。所以我添加了一个 AsyncTask 来在后台运行它。我调用了 requestLocationUpdates(),如果没有 Looper,显然无法在 AsyncTask 中执行。大多数人建议不要使用 Looper,因为我不知道为什么。所以最后我不得不在 AsyncTask.doInBackground() 中添加一个 Runnable 和一个 HandlerRunnable 似乎阻止了调用此服务的 Activity 。当我的应用程序最小化时,这不会发生。事实上,每当执行发生时,我的应用程序的另一个 Activity 也会暂时被阻止。

<强>1。当我在处理程序上调用 Runnable 时到底发生了什么?

<强>2。如何让它真正在后台运行?

    private void forkAsyncForTracking(){
    new AsyncTask<Void, Void, Void>(){
        private Location loc = null;
        @Override
        protected Void doInBackground(Void... params) {
            handler.post(new Runnable(){
                @Override
                public void run() {
                    loc = getLocation();//this blocks the activity
                }
            });
            return null;
        }

        @Override
        protected void onPostExecute(Void lol){
            doIt(loc);
        }
    }.execute();
}

最佳答案

默认情况下,服务在“主”线程上运行。因此,如果您将处理程序声明为服务的私有(private)处理程序,它会被视为在主线程上声明。因此,在 doInBackground 中声明的 runnable 将在主线程上执行。请记住,这取决于将可运行对象发布到执行位置的处理程序。您必须在工作线程中声明处理程序(在本例中为 doInBackground 方法),并使用 Looper.prepare() 定义循环程序(因为默认情况下工作线程没有循环程序,因此不会是处理程序可以使用的消息队列)。尝试一下,此后该方法不应导致任何阻塞。

protected Void doInBackground(Void... params) {
            Handler handler = new Handler();                 //Declared on worker thread.
            Looper.prepare();
            handler.post(new Runnable(){
                @Override
                public void run() {
                    loc = getLocation();//this blocks the activity
                }
            });
            return null;
        }

另一种方法是使用 IntentService,它默认在工作线程上运行,这样您就不需要任何异步任务了。对于 IntentService,检查一下:http://developer.android.com/reference/android/app/IntentService.html

关于java - AsyncTask 中的 Runnable 是否会阻止服务/Activity ?它对我有用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29731830/

相关文章:

windows - windows线程溢出时如何查看当前栈大小

Android 库项目说 nullpointerexception

java - Math.log 和 Math.pow 表达式的问题

java - JPA (Hibernate) 使用 n :m association 生成错误的查询

java - 避免多个 if..elseif 语句

java - .txt 文件在我的计算机上打开时似乎有所不同。在任何其他移动设备上似乎都可以

android - 如何将数据从 Activity 类转发到 View?

java - 有没有更好的方法来使用等待/通知与 AtomicInteger 连接

c# - 如何删除应用程序中启动的所有线程?

java - 如何确定一个字符串是否是另一个字符串的子序列而不考虑其间的字符?