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

Java Android AsyncTask-AsyncTask何时停止运行?,android,android-asynctask,Android,Android Asynctask,我有一个AsyncTask,它运行并完成它的工作。onPostExecute做了它应该做的事情,一切都很好。但该任务仍在Eclipse的调试窗口上运行。每次运行任务时,我都会得到一个新任务。所以我想这不是重复使用任务 以前有人见过这个吗?它不会重用任务。它一直运行,直到onPostExecute完成。它可能仍在调试窗口中,因为对象尚未被垃圾收集。不用担心。我编写此测试应用程序是为了尝试异步任务。它运行5个后台任务,然后必须重用它们。我只是想知道,这是可以的,因为我还没有找到任何关于这个问题的参考

我有一个AsyncTask,它运行并完成它的工作。onPostExecute做了它应该做的事情,一切都很好。但该任务仍在Eclipse的调试窗口上运行。每次运行任务时,我都会得到一个新任务。所以我想这不是重复使用任务


以前有人见过这个吗?

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

我编写此测试应用程序是为了尝试异步任务。它运行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");;
        }

    }

}
package com.mvw.tas;
导入java.io.IOException;
导入android.app.Activity;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.view;
导入android.widget.Button;
公共类TestAsync扩展了活动{
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
按钮btnD=(按钮)findViewById(R.id.Btn01);
btnD.setOnClickListener(新建按钮.OnClickListener(){
@凌驾
公共void onClick(视图v){
新建gback().execute(“”);
}
});
}
////////////////////////////////////////
公共类gback扩展异步任务{
//@凌驾
受保护的IOException doInBackground(字符串…参数){
Log.d(“ASTEST”,“运行背景”);
返回null;
}
@凌驾
受保护的void onPostExecute(IOException结果){
Log.d(“ASTEST”、“后期执行”);
}
@凌驾
受保护的void onPreExecute(){
Log.d(“ASTEST”、“预执行”);;
}
}
}
还有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>

为什么必须“重用任务”?AsyncTask的Javadoc非常清楚:一旦doInBackground()运行完成,我们就不应该重用AsyncTask。尝试重用将导致异常


Javadoc的原话是:“任务只能执行一次(如果尝试第二次执行,将引发异常)。”

调试器中列出的任何对象都不会被垃圾收集。这是因为调试器持有对它们的引用,并且是在onPostExecute中完成的最后一次调试打印的正确行为。这个过程结束了。更糟糕的是,我试着运行了大约20次这个过程,但所有20次都仍然在调试窗口中。如果不知道你在做什么和看到什么,就不可能说出来。但这听起来并不是不合理的。让所有的任务都运行似乎真的很奇怪。当应用程序加载到最终用户时,我将不知道发生了什么。此外,我还将其中一个异步任务上的代码更改为使用线程,这样可以工作,并且不会挂起。然而,使用线程似乎没有那么大的灵活性。我想我需要编写一个hello world应用程序来执行一个异步任务,看看它是如何工作的,所以没有其他东西可以阻止它。我注意到同样的行为,异步任务线程在完成Background和onPostExecute后仍在运行。如果我使用线程而不是AsyncTask,这是可以的。关于垃圾收集器:如何收集正在运行的线程?我猜您不明白这一点。这项任务不会消失。它完成了,但仍挂在进程中。我不想重复使用它,我只想让它停止使用资源。我做了进一步的测试,如果你继续读下去,你会看到它会执行5个任务,在完成5个任务后,它会自动恢复任务。事实上,为什么我们不能再次使用它?我有一个调用http服务器的任务,每次我需要一些数据时,我都想使用它。否则怎么能实现呢?