[RESOLVIDO]Erro: android.os.NetworkOnMainThreadException

Boa tarde a todos,

Estou tentanto conectar com um url com o método GET em PHP(Não vem ao caso já esta funcionando perfeitamente), porém quando faço uma conexão no java com android, com o seguinte código:

StringBuilder strURL = new StringBuilder();
strURL.append("http://10.0.10.4/clientes/insert.php?nome=");
strURL.append(c.getString(c.getColumnIndex("nome")));
strURL.append("&email=");
strURL.append(c.getString(c.getColumnIndex("email")));

HttpClient client = new DefaultHttpClient();
HttpPost requisicao = new HttpPost();
requisicao.setHeader("Content-Type", "text/plain; charset=utf-8");
requisicao.setURI(new URI(strURL.toString()));
HttpResponse resposta = client.execute(requisicao);
BufferedReader br = new BufferedReader(new InputStreamReader(resposta.getEntity().getContent()));

if(bf.readLine().equals("Y")){
	total +=1;
}

E me dar o erro:

03-11 16:18:50.374: W/System.err(2476): android.os.NetworkOnMainThreadException
03-11 16:18:50.376: W/System.err(2476): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
03-11 16:18:50.376: W/System.err(2476): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
03-11 16:18:50.376: W/System.err(2476): at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
03-11 16:18:50.377: W/System.err(2476): at libcore.io.IoBridge.connect(IoBridge.java:122)
03-11 16:18:50.377: W/System.err(2476): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
03-11 16:18:50.377: W/System.err(2476): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
03-11 16:18:50.377: W/System.err(2476): at java.net.Socket.connect(Socket.java:882)
03-11 16:18:50.377: W/System.err(2476): at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
03-11 16:18:50.377: W/System.err(2476): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
03-11 16:18:50.377: W/System.err(2476): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
03-11 16:18:50.378: W/System.err(2476): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
03-11 16:18:50.378: W/System.err(2476): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
03-11 16:18:50.378: W/System.err(2476): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
03-11 16:18:50.378: W/System.err(2476): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
03-11 16:18:50.378: W/System.err(2476): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
03-11 16:18:50.378: W/System.err(2476): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
03-11 16:18:50.379: W/System.err(2476): at br.com.cristaltemper.clientes.Replicar$1$1.onClick(Replicar.java:65)
03-11 16:18:50.379: W/System.err(2476): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:160)
03-11 16:18:50.379: W/System.err(2476): at android.os.Handler.dispatchMessage(Handler.java:102)
03-11 16:18:50.379: W/System.err(2476): at android.os.Looper.loop(Looper.java:135)
03-11 16:18:50.379: W/System.err(2476): at android.app.ActivityThread.main(ActivityThread.java:5221)
03-11 16:18:50.379: W/System.err(2476): at java.lang.reflect.Method.invoke(Native Method)
03-11 16:18:50.380: W/System.err(2476): at java.lang.reflect.Method.invoke(Method.java:372)
03-11 16:18:50.380: W/System.err(2476): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
03-11 16:18:50.380: W/System.err(2476): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

Alguém sabe me dizer o que pode estar ocorrendo para dar este erro?

Consulte a documentação nesses casos. Ela é bem clara:

http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

[quote]The exception that is thrown when an application attempts to perform a networking operation on its main thread.

This is only thrown for applications targeting the Honeycomb SDK or higher. Applications targeting earlier SDK versions are allowed to do networking on their main event loop threads, but it’s heavily discouraged. See the document Designing for Responsiveness. [/quote]

Você não deveria fazer uma conexão na thread principal pois isso iria parar sua Activity (e o Android pode até matá-la após alguns segundos - 5 se não me engano).

Eu implementei a classe Runnable e e sobre escrevi o método Run.

package br.com.cristaltemper.clientes;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Activity;
import android.app.AlertDialog.Builder;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.ConnectivityManager;
import android.net.NetworkInfo.State;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class Replicar extends Activity implements Runnable{

	private Cursor c = null;
	private int total = 0;
	private int totalDB = 0;
	private ProgressDialog pg;
	private SQLiteDatabase db;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.replicar);

		Button btnIniciar = (Button) findViewById(R.id.btnIniciar);
		TextView txvTotal = (TextView) findViewById(R.id.txvTotal);
		
		db = openOrCreateDatabase("cristal.db", Context.MODE_PRIVATE, null);
		c= db.rawQuery("SELECT * FROM clientes", null);
		totalDB = c.getCount();
		txvTotal.setText("Total registros: " + String.valueOf(totalDB));
		
		if(totalDB == 0)
			btnIniciar.setEnabled(false);
		//verifica conezão
		ConnectivityManager conn = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
		if(conn.getNetworkInfo(0).getState() == State.CONNECTED)
			btnIniciar.setEnabled(true);
		 else if(conn.getNetworkInfo(1).getState() == State.CONNECTED)
			btnIniciar.setEnabled(true);
		 else {
			btnIniciar.setEnabled(false);
			txvTotal.setText("Você precisa de conexão!");
		}
		
		btnIniciar.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				Builder msg = new Builder(Replicar.this);
				msg.setMessage("Deseja reiniciar a replição?");
				msg.setPositiveButton("Sim", new DialogInterface.OnClickListener() {
					
					@Override
					public void onClick(DialogInterface dialog, int which) {
						pg = ProgressDialog.show(Replicar.this, "Aguarde...", "Replicando dados", true, false, null);
						Thread t = new Thread(Replicar.this);
						t.start();
					}
				});
					
					
				msg.setNegativeButton("Não", null);
				
				msg.show();
			}
		});
	}

	@Override
	public void run() {
		while(c.moveToNext()){
			//URL
			StringBuilder strURL = new StringBuilder();
			strURL.append("http://10.0.10.4/clientes/insert.php?nome=");
			strURL.append(c.getString(c.getColumnIndex("nome")));
			strURL.append("&email=");
			strURL.append(c.getString(c.getColumnIndex("email")));
			
			//tranforma string em url
			try {
				URL obj = new URL(strURL.toString());
				HttpURLConnection con = (HttpURLConnection) obj.openConnection();
		 
				// optional default is GET
				con.setRequestMethod("GET");
		 
				//add request header
				con.setRequestProperty("User-Agent", "Mozilla/5.0");
		 
				int responseCode = con.getResponseCode();
				System.out.println("\nSending 'GET' request to URL : " + strURL.toString());
				System.out.println("Response Code : " + responseCode);
		 
				BufferedReader in = new BufferedReader(
				        new InputStreamReader(con.getInputStream()));
				if(in.readLine().equals("Y")){
					total +=1;
					
					db.execSQL("DELETE FROM clientes WHERE id=" + c.getInt(c.getColumnIndex("id")));
				}	
				in.close();
				/*URL url = new URL(strURL.toString());
				HttpURLConnection http = (HttpURLConnection) url.openConnection();
				InputStreamReader ipr = new InputStreamReader(http.getInputStream());
				BufferedReader bf = new BufferedReader(ipr);
				
				if(bf.readLine().equals("Y")){
					total +=1;
				}*/
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		handler.sendEmptyMessage(0);
	}
	
	private Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			pg.dismiss();
			if(total == totalDB){
				Toast.makeText(getBaseContext(), "Sucesso: total de " + total + "/" + totalDB,Toast.LENGTH_LONG).show();
			}
			finish();
		}
	};
}

Assim funcionou sem problemas.

Não faça isso. É uma péssima escolha (apesar de funcionar). Uma activity já roda em uma thread, não faz sentido outra parte dela rodar em outra thread.

Mais uma vez, a documentação é uma mão na roda:

http://developer.android.com/training/basics/network-ops/connecting.html