AsyncTask从不执行doInBackground(但在调试中)(更新:已修复)

时间:2011-12-21 22:12:16

标签: android android-asynctask

固定: 事实证明问题是我在将ArrayList传递给Task后将其清除,因此当它执行它时,没有任何东西可以发送。它在调试中工作,因为它可以在我让它进入下一行之前执行。获得的经验教训:不要传递可用于长时间运行任务的变量:)感谢那些回答过的人。

我正在尝试使用异步任务将用户选择数据发送到我的网络服务器。通常,用户将进行选择,并将一个包含3或4个命令的字符串发送到AsyncTask以处理此问题。当我运行代码时,正在创建AsyncTask,但从不执行doInBackground方法。更奇特的是,当我在调试模式下运行并让它逐步完成创建任务时,它可以完美地运行。

private class SendCommandTask extends AsyncTask< ArrayList<Command>, Void, String>{

        protected String doInBackground(ArrayList<Command>... requests){
            conn = null;
            ArrayList<Command> values = requests[0];

            for( int i = 0; i < values.size(); i++){
                try {
                    url = new URL( siteRoot + values.get(i).getEndPoint() );
                    conn = (HttpsURLConnection) url.openConnection();
                    conn.setRequestProperty("Content-Type", "application/json");
                    conn.setRequestProperty("Cookie", authCookie);
                    conn.setReadTimeout(10000 /* milliseconds */);
                    conn.setConnectTimeout(15000 /* milliseconds */);
                    conn.setDoOutput(true);

                    OutputStreamWriter os = new OutputStreamWriter(conn.getOutputStream());
                    os.write(values.get(i).getJson().toString());
                    os.flush();                     
                }catch (IOException e) {
                    e.printStackTrace();
                }
                finally{
                    conn.disconnect();              
                }
            }
            return null;
        }
    }

通过以下方法从UI线程调用:

public void sendCommand(ArrayList<Command> commands){
        new SendCommandTask().execute(commands);
    }

我看过类似的线程,但他们只是建议使用不同的方法,我宁愿不这样做,因为这似乎有效(在debug :()

1 个答案:

答案 0 :(得分:2)

如果它似乎没有执行,可能会在doInBackground中抛出一个异常,在这种情况下,LogCat会有一个来自后台线程的堆栈跟踪(可能像siteRoot那样是空的吗?)