【发布时间】:2011-12-12 12:53:22
【问题描述】:
我正在使用 AsyncTask 通过 Internet 下载数据,但遇到了一个小问题。我需要能够启动一个 AsyncTask 几次,这就是为什么我每次都创建一个新实例,但我注意到它在前三到四次没有任何问题,但之后我的 AsyncTask 是坚持onPreExecute(),之后什么也不做。难道我做错了什么 ? (实际上我一个接一个地使用两个 AsyncTask 只是为了测试目的)。这是我正在使用的示例代码:
这就是我启动 AsyncTasks 的方式:
if (index == 1) {
//Login - first way
new FirstSync().execute(Synchronization.this);
} else if (index == 2) {
//SyncWithHash - second way
SyncWithHash syncHash = new SyncWithHash();
syncHash.execute(Synchronization.this);
} else if (index == 3) {
//Deactivate Collection - third way
deactivateColl = new DeactivateCollection();
deactivateColl.execute(Synchronization.this);
}
我确实尝试了三种不同的方式来启动 asyncTask,但没有改变。这是我的 AsyncTask :
// Sync With Hash
public class SyncWithHash extends AsyncTask <Context, Integer, Void> {
@Override
protected Void doInBackground(Context... arrContext) {
try {
String charset = "UTF-8";
hash = getAuthHash();
SharedPreferences lastUser = PreferenceManager.getDefaultSharedPreferences(Synchronization.this);
int userId = lastUser.getInt("lastUser", 1);
systemDbHelper = new SystemDatabaseHelper(Synchronization.this, null, 1);
systemDbHelper.initialize(Synchronization.this);
String sql = "SELECT dbTimestamp FROM users WHERE objectId=" + userId;
Cursor cursor = systemDbHelper.executeSQLQuery(sql);
if (cursor.getCount() < 0) {
cursor.close();
} else if (cursor.getCount() > 0) {
cursor.moveToFirst();
timeStamp = cursor.getString(cursor.getColumnIndex("dbTimestamp"));
Log.d("", "timeStamp : " + timeStamp);
}
String query = String.format("debug_data=%s&"
+ "client_auth_hash=%s&" + "timestamp=%s&"
+ "client_api_ver=%s&"
+ "set_locale=%s&" + "device_os_type=%s&"
+ "device_sync_type=%s&"
+ "device_identification_string=%s&"
+ "device_identificator=%s&" + "device_resolution=%s",
URLEncoder.encode("1", charset),
URLEncoder.encode(hash, charset),
URLEncoder.encode(timeStamp, charset),
URLEncoder.encode(clientApiVersion, charset),
URLEncoder.encode(locale, charset),
URLEncoder.encode(version, charset),
URLEncoder.encode("14", charset),
URLEncoder.encode(version, charset),
URLEncoder.encode(deviceId, charset),
URLEncoder.encode(resolution, charset));
SharedPreferences useSSLConnection = PreferenceManager
.getDefaultSharedPreferences(Synchronization.this);
boolean useSSl = useSSLConnection.getBoolean("UseSSl", true);
if (useSSl) {
UseHttpsConnection(url, charset, query);
} else {
UseHttpConnection(url, charset, query);
}
} catch (Exception e2) {
e2.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(Integer... progress) {
//cancelDialog.setProgress(progress[0]);
}
@Override
protected void onCancelled() {
Log.d("","ON CANCELLED");
}
@Override
protected void onPreExecute()
{
Log.d("","ON PRE EXECUTE");
// myProgress = 0;
}
@Override
protected void onPostExecute(Void v) {
Log.d("","ON POST EXECUTE");
}
}
所以任何想法为什么它会发生,这是能够多次使用 AsyncTask 而没有任何异常和错误的最佳方法,就像我得到的那样。
还有一个问题:AsyncTask 中是否有任何东西会导致我的连接成为 Reset by peer ,因为我也遇到了这个错误(不是每次)。
非常感谢!
【问题讨论】:
-
您好 Bombastic,您是否注意到您的任何异步线程是否从服务器获得响应?
-
实际上每个 asynctask 一开始都会得到响应,但是运行几次后它们一直卡在
onPreExecute,甚至一开始都没有显示来自doInBackground的日志。 -
您能解释一下您在问题中使用的
getDefaultSharedPreferences(Synchronization.this)是什么吗?