gpt4 book ai didi

Android异步任务运行几次后停止运行

转载 作者:行者123 更新时间:2023-11-29 02:09:06 24 4
gpt4 key购买 nike

我正在使用 AsyncTask 通过 Internet 下载数据,但遇到了一个小问题。我需要能够启动一个 AsyncTask 几次,这就是为什么我每次都创建一个新实例,但我注意到它在前三四次都没有任何问题,但之后我的 AsyncTask 是停留在 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,但没有任何改变。这是我的异步任务:

    // 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() 挂起,则它不会影响其他 AsyncTask。这将 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 时,触发一个 Runnable 以在 GUI 线程上运行:

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();

(示例来自 http://code.google.com/p/android-eksempler/source/browse/trunk/AndroidElementer/src/eks/asynkron/Asynkron1Thread.java?spec=svn109&r=109)

关于Android异步任务运行几次后停止运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8474611/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com