嗨,我有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并执行所有这些,它们会成功运作吗?
谢谢。答案 0 :(得分:1)
你可以同时执行多个AsyncTask
没有问题,
因为每个AsyncTask
都会在Separate Worker Thread
中运行,所以它不会对主线程产生影响。
I / Choreographer:跳过39帧!该应用程序可能也在做 在其主线上做了很多工作。
实际上你在模拟器上运行,所以与真实设备相比它太慢了,所以你会看到上面的共同信息。如果你在真实设备上运行你不会看到那种消息。
希望这会对你有所帮助。