固定: 事实证明问题是我在将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 :()
答案 0 :(得分:2)
如果它似乎没有执行,可能会在doInBackground
中抛出一个异常,在这种情况下,LogCat会有一个来自后台线程的堆栈跟踪(可能像siteRoot
那样是空的吗?)