Java Android AsyncTask - AsyncTask 何时停止运行?

4
我有一个AsyncTask在运行,完成任务后onPostExecute执行了它应该做的事情,一切都很好。但是在Eclipse的调试窗口中,任务仍在运行。每次运行任务时,我都会得到一个新任务。所以我猜测它没有重复使用任务。你们有人见过这种情况吗?
4个回答

1
为什么必须“重复使用任务”?AsyncTask的Javadoc非常清楚:一旦doInBackground()运行完成,我们不应该重复使用AsyncTask。尝试重用将导致异常。
Javadoc的确切措辞:“任务只能被执行一次(如果尝试第二次执行将抛出异常)”。

我猜你没有理解这个。任务不会消失。它会完成,但仍然挂在进程中。我不想重用它,我只想让它停止使用资源。如果你继续阅读,你会看到它创建了5个任务,当5个任务完成后,它会自动重新使用任务。 - Mark Worsnop
实际上 - 为什么我们不能再次使用它呢?我有一个调用HTTP服务器的任务,每次我需要一些数据时,我都想使用它。否则该如何实现? - Dani

1

它不会重复使用任务。它会一直运行,直到onPostExecute完成。它可能仍然在您的调试窗口中,因为对象尚未被垃圾回收。不用担心。


最后一个调试打印完成于onPostExecute。进程已经结束。为了好玩,我尝试运行该进程约20次,所有20次都仍在调试窗口中。 - Mark Worsnop
把所有任务都保持运行状态似乎很奇怪。当应用程序加载到最终用户时,我将不知道正在发生什么。 - Mark Worsnop
就像我说的,很难确定。如果您在异步任务中使用的代码发布出来,我们可能可以提供帮助。还有您是如何调用它的。 - Falmarri
那么你的结论是不用担心异步任务会挂起吗? - Eugene van der Merwe
1
我注意到了相同的行为,AsyncTasks线程即使在完成doInBackground和onPostExecute后仍在运行。如果我使用线程而不是AsyncTask,那就没问题了。关于垃圾收集器:正在运行的线程如何被收集? - peceps
显示剩余2条评论

0
我写了这个测试应用程序来尝试asynctask。它运行5个后台任务,然后必须重复使用它们。我只想知道这样做是否可以,因为我没有找到任何关于这个问题的参考资料。我想知道为什么是5个任务?它们释放内存和其他占用的资源吗?我本来想把这个放在注释中,但好像不允许代码片段。
    package com.mvw.tas;

import java.io.IOException;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class TestAsync extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        Button btnD = (Button)findViewById(R.id.Btn01);

        btnD.setOnClickListener(new Button.OnClickListener() {

            @Override
            public void onClick(View v) {
                new gback().execute( "");
            }
        });

    }

    ////////////////////////////////////////
    public class gback extends AsyncTask<String, Void, IOException> {
        //@Override
        protected IOException doInBackground(String... params) {
            Log.d( "ASTEST", "Running background");
            return null;

        }

        @Override
        protected void onPostExecute(IOException result) {
            Log.d( "ASTEST", "Post Exec");


        }

        @Override
        protected void onPreExecute() {

            Log.d( "ASTEST", "PRE Exec");;
        }

    }

}

和XML

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />



<Button android:text="Test AysncTask" android:id="@+id/Btn01" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
</LinearLayout>

0

调试器中列出的任何对象都不会被垃圾回收。这是因为调试器持有对它们的引用,这是正确的行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接