Minha sugestão seria quebrar seu código em 3 classes diferentes, para não ficar tudo embolado e separar as responsabilidades de cada uma:
Uma Activity
deve ser responsável somente por controlar a tela e exibir coisas nela e não precisamos alterar o seu construtor, pois não somos responsáveis por dar new
nela. Quem cuida disso é o Android.
Uma AsyncTask
deve cuidar somente de tarefas assíncronas (como acesso ao webservice, por exemplo)
Usando essas duas dicas, fiz isso aqui:
A sua classe DBActivity
na realidade não gerencia nada da tela, ela cuida apenas da conexão com seu webservice. Então tirei a herança, deixei apenas a asynctask lá dentro e chamei de DBConector
:
public class DBConector extends AsyncTask<String, Integer, String> {
private final Map<String, String> dados;
private final String url;
private final Context ctx;
public ProgressDialog progressDialog;
public DBConector(Map<String, String> dados, String url, Context ctx) {
this.dados = dados;
this.url = url;
this.ctx = ctx;
}
public void executa() {
Log.i("PilatesOn", "instanciou o executor");
this.execute();
}
@Override
protected void onPreExecute() {
progressDialog = new ProgressDialog(ctx);
progressDialog.setMessage("Carregando...");
progressDialog.show();
}
@Override
protected String doInBackground(String... params) {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
Log.i("Filtro", "instanciou a DB");
String responseContent = null;
try {
// Add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
Set<String> chaves = dados.keySet();
for (Iterator<String> iterator = chaves.iterator(); iterator.hasNext(); ) {
String chave = iterator.next();
if (chave != null) {
nameValuePairs.add(new BasicNameValuePair(chave, dados.get(chave)));
}
}
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
Log.i("Filtro", "Fez a requisição post");
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
if (response != null) {
InputStream in = response.getEntity().getContent();
responseContent = inputStreamToString(in);
Log.i("Filtro", "Resultado " + responseContent);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
Log.i("Filtro", "Ciente exception: " + e.getMessage());
} catch (IOException e) {
e.printStackTrace();
Log.i("Filtro", "IOS exception: " + e.getMessage());
}
return responseContent;
}
@Override
protected void onPostExecute(String result) {
if (progressDialog != null) {
progressDialog.dismiss();
}
// process the result
super.onPostExecute(result);
}
private String inputStreamToString(InputStream is) throws IOException {
String line = "";
StringBuilder total = new StringBuilder();
// Wrap a BufferedReader around the InputStream
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
// Read response until the end
while ((line = rd.readLine()) != null) {
total.append(line);
}
// Return full string
return total.toString();
}
}
Como você tinha uma classe Login
, mantive ela e fiz ela ser a responsável por instanciar esse DBConector
:
public class Login implements View.OnClickListener {
private final Map<String, String> dados;
private final String url;
private final Context ctx;
public Login(Map<String, String> dados, String url, Context ctx) {
this.dados = dados;
this.url = url;
this.ctx = ctx;
}
@Override
public void onClick(View v) {
DBConector db = new DBConector(dados, url, ctx);
db.executa();
}
}
E essa classe Login
é chamada lá no clique do botão:
Map<String, String> dados; //Você precisa passar isso aqui;
String url; //Precisa popular essa variável também;
Button login = (Button) findViewById(R.id.btn_login);
login.setOnClickListener(new Login(dados, url, this));
Veja que o terceiro argumento do Login
é o context.
Abraço.