在Android中无法正常工作时调用多个AsyncTask

Jee*_*mar 6 android android-asynctask

我想打多个电话AsynTask.它没有用,所以我谷歌寻求帮助.我发现如果我使用AsyncTask.THREAD_POOL_EXECUTOR那么它会起作用.

但它不起作用.

我把它称为如下:

new GetCategory().execute();
new GetArea().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
Run Code Online (Sandbox Code Playgroud)

请帮我解决这个问题.我想一次打电话,或者如果GetArea()打电话也可以GetCategory().我没有收到错误.应用程序可能做了太多工作.
logcat的:

03-13 21:21:43.134: I/Choreographer(1222): Skipped 39 frames!  The application may be doing too much work on its main thread.
03-13 21:21:43.394: I/Choreographer(1222): Skipped 43 frames!  The application may be doing too much work on its main thread.
03-13 21:21:43.634: I/Choreographer(1222): Skipped 36 frames!  The application may be doing too much work on its main thread.
03-13 21:21:43.784: I/Choreographer(1222): Skipped 38 frames!  The application may be doing too much work on its main thread.
03-13 21:21:44.004: I/Choreographer(1222): Skipped 56 frames!  The application may be doing too much work on its main thread.
03-13 21:21:44.164: I/Choreographer(1222): Skipped 36 frames!  The application may be doing too much work on its main thread.
03-13 21:21:45.495: I/Choreographer(1222): Skipped 33 frames!  The application may be doing too much work on its main thread.
03-13 21:21:45.765: I/Choreographer(1222): Skipped 43 frames!  The application may be doing too much work on its main thread.
03-13 21:21:46.005: I/Choreographer(1222): Skipped 36 frames!  The application may be doing too much work on its main thread.
03-13 21:21:46.235: I/Choreographer(1222): Skipped 44 frames!  The application may be doing too much work on its main thread.
03-13 21:21:46.525: I/Choreographer(1222): Skipped 48 frames!  The application may be doing too much work on its main thread.
03-13 21:21:46.855: I/Choreographer(1222): Skipped 39 frames!  The application may be doing too much work on its main thread.
03-13 21:21:47.005: I/Choreographer(1222): Skipped 39 frames!  The application may be doing too much work on its main thread.
03-13 21:21:47.156: I/Choreographer(1222): Skipped 37 frames!  The application may be doing too much work on its main thread.
03-13 21:21:47.306: I/Choreographer(1222): Skipped 38 frames!  The application may be doing too much work on its main thread.
Run Code Online (Sandbox Code Playgroud)

我对两者都有约束力AsynTask.
我的代码:

        Area[] areaList = gson.fromJson(result, Area[].class);

        List<Area> lList = Arrays.asList(areaList);
        Area objArea;

        areaId.add("0");
        areaName.add("Select Area");

        for (int i = 0; i < lList.size(); i++) {
            objArea = lList.get(i);
            areaName.add(objArea.getAreaName());
            areaId.add(objArea.getAreaId());
        }

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                        getActivity(), android.R.layout.simple_dropdown_item_1line, areaName);
                ((Spinner) spnCEArea).setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)

nKn*_*nKn 5

你不能同时在同一个项目中调用两个.execute()方法的原因AsyncTask是Android引入的修改Gingerbread.在此版本之前,您可以调用.execute()所需的次数,因为每个都是单独运行的Thread.

但是在这个版本中,它们被顺序调用,所以如果一个正在执行,另一个如果你只是打电话就不会启动.execute().

因此,基本上您需要做的就是检查您正在运行的设备的版本,AsyncTask并根据它运行一个或其他命令.

if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB_MR1)
  your_asynctask.execute(your_params);
else
  your_asynctask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, your_params);
Run Code Online (Sandbox Code Playgroud)

更多信息在这里.

顺便说一句,这些The application may be doing too much work on its main thread.线与之无关AsyncTask.这些任务正在后台运行,如果你在方法中进行工作doInBackground(),那不是问题.

稍微不同的情况可能是你在你的onPostExecute()任务中做了一些工作,因为这可能与你的主用户界面有关,但是如果不知道你正在运行的代码,我们就无法告诉你更多.


小智 1

我可以使用 2 个异步任务:

new GetCategory().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"");
new GetArea().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"");
Run Code Online (Sandbox Code Playgroud)

如果它不起作用并且崩溃,请发布您的 logcat。如果它确实发布了您的代码。