[英]Android Async Task stop running after run it a few times
我正在使用AsyncTask通过Internet下载数据,但有一个小问题。 我需要能够启动一个AsyncTask几次,这就是为什么我每次都要创建一个新实例,但是我注意到的是它在前三到四次都没有问题,但是之后我的AsyncTask是卡在onPreExecute()
上, onPreExecute()
什么也不做。 难道我做错了什么 ? (实际上,我只是为了测试目的而一个接一个地使用两个AsyncTasks)。 这是我正在使用的示例代码:
这就是我启动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
,因为我也收到此错误(并非每次都收到)。
非常感谢!
我认为您的doInBackground()正在挂起。 在进入和退出时制作日志语句,然后进行检查。
在过去,AsyncTask具有线程池,因此如果doInBackground()挂起,则不会影响其他AsyncTasks。 这将AFAIK与Android 2.2或2.3更改为一个线程同时处理所有AyncTasks。 因此,如果doInBackground()挂起,则可能会影响下一个正在启动的AsyncTasks,并且将在onPreExecute()之后挂起。
编辑:它已从单个线程更改为多个,然后又回到单个线程: http : //developer.android.com/reference/android/os/AsyncTask.html#execute%28Params...%29 “首次引入时,AsyncTasks是在单个后台线程上串行执行的,从DONUT开始,它已更改为线程池,从而允许多个任务并行运行。在HONEYCOMB之后,计划将其更改回单个线程,以避免并行执行导致的常见应用错误。”
如果您确实希望无限量的东西“平行”悬挂,则不要使用AsyncTask。 使用良好的旧线程,这些旧线程在需要更新GUI时会触发要在GUI线程上运行的Runnable:
Button knap1, knap2, knap3;
...
Runnable r=new Runnable() {
public void run() {
// Do some stuff than hangs
try { Thread.sleep(10000); } catch (InterruptedException ex) {}
System.out.println("færdig!");
// Update GUI thread
Runnable r2=new Runnable() {
public void run() {
knap3.setText("færdig!");
}
};
runOnUiThread(r2);
}
};
new Thread(r).start();
这可能是因为您要在对象“ Synchronization.this”上进行同步。还注意到您没有关闭打开的游标。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.