如何执行多AsyncTask串行或并行?

时间:2015-06-27 11:17:40

标签: android android-asynctask

嗨,我有2个AsynkTasks从服务器获取数据并将其保存到SQLite中。

当我点击按钮时,这两个方法将调用:

btnGetICDatabase.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            requestAData("http://192.168.91.1/JSON-test/Table1.php");
            requestMData("http://192.168.91.1/JSON-test/Table2.php");
        }
    });

private void requestAData(String uri) {
    GetATDataTask getATDataTask = new GetATDataTask();
    getATDataTask.execute(uri);
}

private void requestMData(String uri) {
    GetMTDataTask getMTDataTask = new GetMTDataTask();
    getMTDataTask.execute(uri);
}

这是AsyncTasks:

private class GetATDataTask extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {

        //Make ProgressBar Visible
        if (activityTasks.size() == 0) {
            pbLoading.setVisibility(View.VISIBLE);
        }
        activityTasks.add(this);

    }

    @Override
    protected String doInBackground(String... params) {

        if (httpManager.isWiFi(getApplicationContext())) {
            if (httpManager.isServerReachable(getApplicationContext(), ACTIVITY_TABLE_URL)) {
                String activityContent = HttpManager.getData(params[0]);
                dataSource.removeActivityRecords();
                return activityContent;
            } else {
                return null;
            }
        } else {
            return null;
        }

    }

    @Override
    protected void onPostExecute(String result) {

        if (result != null) {
            activityTableModelList = IronClubJSONParser.activityParsFeed(result);
            insertData.insertDataToAT(activityTableModelList);
        } else {
            Log.i(LOGTAG, "Activity Table couldn't Updated!");
        }
        //Make ProgressBar Invisible
        activityTasks.remove(this);
        if (activityTasks.size() == 0) {
            pbLoading.setVisibility(View.INVISIBLE);
        }

    }

    @Override
    protected void onProgressUpdate(String... values) {

    }
}

private class GetMTDataTask extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {

        //Make ProgressBar Visible
        if (musclesTasks.size() == 0) {
            pbLoading.setVisibility(View.VISIBLE);
        }
        musclesTasks.add(this);

    }

    @Override
    protected String doInBackground(String... params) {

        if (httpManager.isWiFi(getApplicationContext())) {
            if (httpManager.isServerReachable(getApplicationContext(), MUSCLES_TABLE_URL)) {
                String musclesContent = HttpManager.getData(params[0]);
                dataSource.removeMusclesRecords();
                return musclesContent;
            } else {
                return null;
            }
        } else {
            return null;
        }

    }

    @Override
    protected void onPostExecute(String result) {

        if (result != null) {
            musclesTableModelList = IronClubJSONParser.musclesParsFeed(result);
            insertData.insertDataToMT(musclesTableModelList);
        } else {
            Log.i(LOGTAG, "Muscles Table couldn't Updated!");
        }
        //Make ProgressBar Invisible
        musclesTasks.remove(this);
        if (musclesTasks.size() == 0) {
            pbLoading.setVisibility(View.INVISIBLE);
        }

    }

    @Override
    protected void onProgressUpdate(String... values) {

    }
}

当我点击按钮时,一切正常,但我得到了这个Info Logcat:

  

I / Choreographer:跳过39帧!应用程序可能在其主线程上做了太多工作。

这样:

1)有没有更好的方法来执行多个AsynkTasks?

2)女巫执行方法更好?串行还是并行?

3)如果我有超过10个AsynkTasks并执行所有这些,它们会成功运作吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

你可以同时执行多个AsyncTask没有问题,

因为每个AsyncTask都会在Separate Worker Thread中运行,所以它不会对主线程产生影响。

  

I / Choreographer:跳过39帧!该应用程序可能也在做   在其主线上做了很多工作。

实际上你在模拟器上运行,所以与真实设备相比它太慢了,所以你会看到上面的共同信息。如果你在真实设备上运行你不会看到那种消息。

希望这会对你有所帮助。