Android AsyncTask已在创建时启动

Android AsyncTask已在创建时启动,android,multithreading,background,android-asynctask,Android,Multithreading,Background,Android Asynctask,当我尝试通过单击按钮执行异步任务时,我的应用程序会显示该任务已启动。我不会在onCreate、onResume或类似的任何地方执行任务。在创建活动时,任务是否可以启动,而无需我以编程方式执行它 // Login button Button loginButton = (Button) findViewById(R.id.loginBtn); loginButton.setOnClickListener(new Button.OnClickListener() {

当我尝试通过单击按钮执行异步任务时,我的应用程序会显示该任务已启动。我不会在onCreate、onResume或类似的任何地方执行任务。在创建活动时,任务是否可以启动,而无需我以编程方式执行它

    // Login button
    Button loginButton = (Button) findViewById(R.id.loginBtn);
    loginButton.setOnClickListener(new Button.OnClickListener() 
    {
        public void onClick(View v) 
        {                
            loginTask.execute("");
        }
    });


// Background login thread
private AsyncTask<Object, String, String> loginTask = new AsyncTask<Object, String, String>(){

    @Override
    protected String doInBackground(Object... arg0) 
    {
        Log.v(TAG, "Login task started");
        LoginManager lm = new LoginManager();
        String username = emailText.getText().toString();
        String password = passwordText.getText().toString();
        loginBundle = new Bundle();
        loginBundle.putString(Constants.LOGIN_HANDLER_ID, lm.login(username, password));
        loginMessage = Message.obtain(null, 0);
        loginMessage.setData(loginBundle);
        loginHandler.sendMessage(loginMessage);
        return "";
    }

};
//登录按钮
按钮登录按钮=(按钮)findViewById(R.id.loginBtn);
loginButton.setOnClickListener(新建按钮.OnClickListener()
{
公共void onClick(视图v)
{                
loginTask.execute(“”);
}
});
//后台登录线程
private AsyncTask loginTask=new AsyncTask(){
@凌驾
受保护的字符串doInBackground(对象…arg0)
{
Log.v(标记“登录任务已启动”);
LoginManager lm=新的LoginManager();
字符串username=emailText.getText().toString();
字符串密码=passwordText.getText().toString();
loginBundle=新绑定();
loginBundle.putString(Constants.LOGIN\u HANDLER\u ID,lm.LOGIN(用户名、密码));
loginMessage=Message.get(null,0);
loginMessage.setData(loginBundle);
loginHandler.sendMessage(loginMessage);
返回“”;
}
};
这是我唯一调用execute的地方,也是我在onCreate()方法中创建的一个按钮。当任务执行时,我得到一个任务已启动错误


我想也许我没有正确地取消线程,所以我重新启动了我的Motrola Xoom。我在Xoom启动后运行了这个应用程序,但仍然出现了这个错误。我能做什么?该应用程序正在使用Android SDK 8。。。我在摩托罗拉Xoom上运行。

像这样调用您的异步任务

new LoginTask().execute(""); 
在哪里

私有类登录任务扩展
异步任务{
.....
}

异步任务一旦完成,就无法执行。您必须创建一个新对象并启动它。您似乎将“”作为任务参数传递,并返回“”,即使您实际上并不需要它。将
String
替换为
Void
,这样您就不需要再这样做了,除非真的需要。这是真的,我应该启动一个新对象。但是出于好奇,为什么在我重新启动的时候,设备没有停止已经完成的异步任务呢?谢谢!!!看起来我也不必再使用cancel()。我猜android会帮我清理这些线程?我不希望有人多次尝试登录,产生大量永不消亡的线程。不,你也不需要取消()。这是由onPostExecute()完成的。它就像一个析构函数,它将在执行结束后清理线程并释放资源。你不必担心。
private class LoginTask extends
    AsyncTask<Object,String, String> {
.....

}