我使用AsyncTask通過互聯網下載數據,我有一個小問題。我需要能夠幾次啓動一個AsyncTask,這就是爲什麼我每次都創建一個新實例的原因,但我注意到的是,前三到四次它沒有任何問題,但在此之後,我的AsyncTask之後停滯在onPreExecute()
之後。難道我做錯了什麼 ? (實際上,我爲了測試目的一個接一個地使用兩個AsyncTasks)。下面是我使用的示例代碼:Android異步任務停止運行幾次後運行
我這是怎麼開始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
的問題,因爲我也收到了這個錯誤(不是每次都是這樣)。
非常感謝!
你好誇張,你有沒有注意到,如果任何你的asynk線程從服務器獲得響應? –
其實每個asynctask都會在開始時得到響應,但經過幾次運行後,它們會停留在'onPreExecute'中,甚至不會在開始時顯示來自'doInBackground'的日誌。 –
你能解釋一下你在問題中使用的getDefaultSharedPreferences(Synchronization.this)嗎? –