Problemas com múltiplas requisições a web service com AsyncTask

Pessoal, boa tarde.

Implementei um processo de importação de dados com requisições a vários métodos de um web service e estou tendo alguns problemas e dúvidas de qual seria a melhor maneira de implementá-lo.

Primeiramente, eu tenho diversas tabelas que são preenchidas com essas requisições. Então eu criei apenas uma AsyncTask e chamo todas as requisições dentro do doInBackground:

[code] @Override
protected Void doInBackground(Void… params) {
// TODO Auto-generated method stub

		Cliente cliente = new Cliente();
		cliente.setWsRepresentante(getSharedPreferences("PREFS_PRIVATE", MODE_PRIVATE).getInt("representante", 0));
		cliente.importarDados();

		TabelaPreco tabelaPreco = new TabelaPreco();
		tabelaPreco.setWsRepresentante(getSharedPreferences("PREFS_PRIVATE", MODE_PRIVATE).getInt("representante", 0));
		tabelaPreco.importarDados();

		ClienteEndereco clienteEndereco = new ClienteEndereco();
		clienteEndereco.setWsRepresentante(getSharedPreferences("PREFS_PRIVATE", MODE_PRIVATE).getInt("representante", 0));
		clienteEndereco.importarDados();

		Comprador comprador = new Comprador();
		comprador.setWsRepresentante(getSharedPreferences("PREFS_PRIVATE", MODE_PRIVATE).getInt("representante", 0));
		comprador.importarDados();
		
		ProdutoPreco produtoPreco = new ProdutoPreco();
		produtoPreco.setWsRepresentante(getSharedPreferences("PREFS_PRIVATE", MODE_PRIVATE).getInt("representante", 0));
		produtoPreco.importarDados();
		
		Embalagem embalagem = new Embalagem();
		embalagem.setWsRepresentante(getSharedPreferences("PREFS_PRIVATE", MODE_PRIVATE).getInt("representante", 0));
		embalagem.importarDados();
		
		Produto produto = new Produto();
		produto.setWsRepresentante(getSharedPreferences("PREFS_PRIVATE", MODE_PRIVATE).getInt("representante", 0));
		produto.importarDados();
		
		Grupo grupo = new Grupo();
		grupo.setWsRepresentante(getSharedPreferences("PREFS_PRIVATE", MODE_PRIVATE).getInt("representante", 0));
		grupo.importarDados();
		
		FormaPagamento formaPagamento = new FormaPagamento();
		formaPagamento.setWsRepresentante(getSharedPreferences("PREFS_PRIVATE", MODE_PRIVATE).getInt("representante", 0));
		formaPagamento.importarDados();
		
		Cidade cidade = new Cidade();
		cidade.setWsRepresentante(getSharedPreferences("PREFS_PRIVATE", MODE_PRIVATE).getInt("representante", 0));
		cidade.importarDados();
		
		return null;
	}[/code]

O processo consiste em fazer a chamada do método importarDados() de cada uma das classes que chama o super método da classe de Persistência, que realiza este processo para cada uma das chamadas:

[code]DataBase = new DadosBD(Singleton.getContextoAplicacao());
SoapObject request = new SoapObject(this.getWsNameSpace(), this.getWsNomeMetodo());
request.addProperty(“representante”, WsRepresentante);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.implicitTypes = false;
envelope.setOutputSoapObject(request);

		HttpTransportSE httpTransport = new HttpTransportSE(this.getWsUrl());
		httpTransport.call(this.getWsNameSpace() + "" + this.getWsNomeMetodo(), envelope);
		SoapObject result = (SoapObject) envelope.getResponse();
		
		if (result != null) {
			
			int resultCount = result.getPropertyCount();
			
			if(resultCount > 0){
				
				SoapObject objResult = new SoapObject();
				SoapObject objSoap = new SoapObject();

				objResult = (SoapObject) result.getProperty(1);
				if(objResult.getPropertyCount() > 0){
					
					objSoap = (SoapObject) objResult.getProperty(0);
					int propertyResultCount = objSoap.getPropertyCount();
	                
	                if (propertyResultCount > 0){

	                	DataBase.BeginTransaction();
	                	
	                	SQLiteStatement stmtInsert = DataBase.getDataBase().compileStatement(DataBase.ExecInsertBuilder(Tabela, TabelaColunaComposta));
	                	SQLiteStatement stmtSelect = DataBase.getDataBase().compileStatement(DataBase.ExecSelectBuilder(false, Tabela, TabelaSelecaoArgumentos, TabelaSelecao, TabelaGroupBy, TabelaHaving, TabelaOrderBy, "1"));
	                	SQLiteStatement stmtUpdate = DataBase.getDataBase().compileStatement(DataBase.ExecUpdateBuilder(Tabela, TabelaColunaComposta, TabelaWhereArgumentos));
	                	
	                	this.Dados = new ContentValues();
	                	
	                	for (int currentProperty = 0; currentProperty < propertyResultCount; currentProperty++) {
		       	    		 
	                        SoapObject obj = (SoapObject) objSoap.getProperty(currentProperty);
	                        int attributeResultCount = obj.getPropertyCount();
	                        
	                        for(int index = 0; index < attributeResultCount; index++){
	                        	
	                        	PropertyInfo pi = new PropertyInfo();
	                        	obj.getPropertyInfo(index, pi);
	                        	stmtInsert.bindString(index + 1, ((pi.getValue().toString().equals("anyType{}")?(""):(pi.getValue().toString()))));
	                        	stmtUpdate.bindString(index + 1, ((pi.getValue().toString().equals("anyType{}")?(""):(pi.getValue().toString()))));
	                        	this.Dados.put(pi.name.toString(), ((pi.getValue().toString().equals("anyType{}")?(""):(pi.getValue().toString()))));
	                        }
	                        
	                        for (int i = 0; i < this.getCamposPK().length; i++) {
	                        	stmtSelect.bindString(i + 1, this.Dados.get(CamposPK[i].toString()).toString());
	                        }
	                        
	                        if(!(stmtSelect.simpleQueryForLong()==1)){
	                        	stmtInsert.executeInsert();
	                        }else{
	                        	stmtUpdate.execute();
	                        }
	                    }
	                	DataBase.SetTransaction();
	                	DataBase.EndTransaction();
	                }
				}
			}
		}[/code]

O que eu notei:

- Testando este processo em meu smartphone um Razr, ele funcionou corretamente. Mas testando em um aparelho inferior que roda a versão 2.2 ocorreriam erros nas requisições. Às vezes baixava uma das requisições e nas próximas ocorriam erros de SocketTimeout e erros do tipo e isso apenas neste aparelhos inferiores.

- Também tive erros nesses aparelhos inferiores com exceções de FutureTask na sub-classe da AsyncTask.

- Quando o usuário estava utilizando o 3G para efetuar este processo, também ocorreram erros. Uma simples oscilação de sinal ou coisa do tipo era o suficiente para que o processo fosse abortado.

Então gostaria de saber, qual seria a maneira correta de fazer um processo deste tipo.

Dividir todas as requisições para cada uma ter sua própria AsyncTask e chamá-las em sequência uma dentro do onPostExecute() da outra ou esta maneira esta correta?
Ou o que eu poderia fazer para tornar este processo mais seguro e com garantias de que será completo?

Lembrando que este processo não precisa ser paralelo, acho que o ideal seria exatamente serem executados em sequência. Para garantir que cada um deles seja concluído corretamente.

Se alguém puder me ajudar ficarei muito grato.
Já fiz diversas alterações nos processos tentando corrigi-los mas até agora não cheguei em uma conclusão.

Obrigado desde já.

Voce pode enfileirar AsyncTasks para serem executas em um Executor (com duas ou tres threads por exemplo) e orquestrar o sincronomismo entre UI e dados.