我正在使用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 ,因为我也收到此错误(并非每次都收到)。

非常感谢!

===============>>#1 票数:1 已采纳

我认为您的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();

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

===============>>#2 票数:0

这可能是因为您要在对象“ Synchronization.this”上进行同步。还注意到您没有关闭打开的游标。

  ask by Android-Droid translate from so

未解决问题?本站智能推荐:

1回复

Android异步任务持续运行且不会停止

我正在使用一个异步任务来在菜单项单击上设置墙纸,但它会继续运行并且不会停止。 这是我正在使用的代码: 在项目选择功能中,我正在执行以下操作: 我要去哪里错了? 谢谢
2回复

激活后运行异步任务

我想确保当我移至另一个活动时,我在android活动中启动的异步任务将完成。 我认为会的。 请提供正确答案。 谢谢
1回复

Android:单击按钮后停止异步任务

我正在开发一个应用程序,在该应用程序中,单击按钮即可在后台发送短信。 代码如下: 点击时 发送短信方法 背景类 现在该应用程序的需求是: 我在屏幕上还有一个按钮作为停止按钮。 我想在单击该停止按钮时停止异步任务,并想调用新的活动。 请指导我,现在我该
4回复

为什么在Android Async任务中无法正常运行

我有一个活动,这是splash activity ,我想在其中加载2个音乐,加载完成后,我想开始欢迎页面,不幸的是我做错了。 即使我获得了加载完成时制作的log ,但也获得了未加载2音乐时的日志。 日志记录 码
2回复

如何停止正在运行的异步任务? [重复]

这个问题已经在这里有了答案: 停止AsyncTask doInBackground方法 1回答 我在android中运行异步任务来ping特定的URL,但问题是当url无效或不可访问时,由于sockettimeoutexception发生异常,因此该异常我想停止正在
1回复

在Android中运行异步任务1分钟

我想将我的异步任务运行几分钟,如果它提前完成工作,则停止。 我能做到吗? 如果是,那么该怎么做。
1回复

在android中终止正在运行的下载异步任务

我正在开发一个图像下载器,它是一个异步下载器。 每当需要在互联网上显示图像时我都会打电话 图像异步下载器(输入是目标图像视图,图像URL) 我的应用程序的结构是一个tabhost,当我切换到特定的选项卡时,例如在第4部分,有一个gridview,它将触发imageloader a
1回复

无法在Android 4.2上运行异步任务的新实例

我有代码,可以完美地在android 2.3.3上运行,但是不能在android 4.2上运行。 活动开始时,它应调用扩展AsyncTask的Initialize类的实例。 但是,在第一个活动开始时-它起作用,当我转到其他活动时又返回- progress微调器正在旋转,并且什么也没有发生,即
2回复

Android异步任务运行时异常错误。

我在android平台上执行解密任务。 首先,我创建一个称为RunDecrypt的方法。 当我按用户界面中的按钮时,它工作正常。 方法如下图所示: 由于工作正常,因此我尝试使用Async Task实现此方法,以在后台运行我的工作。 实现的类如下所示: 我的onClick方
3回复

android 2异步任务并行运行

在我的一个项目中,我必须从服务器下载大约20到25个json文件数据,并且必须解压缩它,所以有2个进程1.download 2解压缩它。 我已经使用了2个异步任务。 1用于下载,第二用于解压缩。.i从第一发布执行开始第二异步。 我想做..如果文件下载开始第二次异步任务以解压缩该下载文件..