[英]Android HTTP Request AsyncTask
我想实现一个类来处理我的应用程序的所有HTTP请求,它基本上是:
因此,我将不得不从服务器(JSON)获取结果字符串并将其传递给另一个方法来处理响应。
我目前有这样的方法:
public class Get extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... arg) {
String linha = "";
String retorno = "";
mDialog = ProgressDialog.show(mContext, "Aguarde", "Carregando...", true);
// Cria o cliente de conexão
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(mUrl);
try {
// Faz a solicitação HTTP
HttpResponse response = client.execute(get);
// Pega o status da solicitação
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) { // Ok
// Pega o retorno
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
// Lê o buffer e coloca na variável
while ((linha = rd.readLine()) != null) {
retorno += linha;
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return retorno;
}
@Override
protected void onPostExecute(String result) {
mDialog.dismiss();
}
}
public JSONObject getJSON(String url) throws InterruptedException, ExecutionException {
// Determina a URL
setUrl(url);
// Executa o GET
Get g = new Get();
// Retorna o jSON
return createJSONObj(g.get());
}
但是g.get()
返回一个空响应。 我该如何解决这个问题?
我认为你并不完全理解AsyncTask的工作方式。 但我相信你希望将代码重用于不同的任务; 如果是这样,您可以创建一个抽象类,然后扩展它,实现您创建的抽象方法。 它应该这样做:
public abstract class JSONTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... arg) {
String linha = "";
String retorno = "";
String url = arg[0]; // Added this line
mDialog = ProgressDialog.show(mContext, "Aguarde", "Carregando...", true);
// Cria o cliente de conexão
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(mUrl);
try {
// Faz a solicitação HTTP
HttpResponse response = client.execute(get);
// Pega o status da solicitação
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) { // Ok
// Pega o retorno
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
// Lê o buffer e coloca na variável
while ((linha = rd.readLine()) != null) {
retorno += linha;
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return retorno; // This value will be returned to your onPostExecute(result) method
}
@Override
protected void onPostExecute(String result) {
// Create here your JSONObject...
JSONObject json = createJSONObj(result);
customMethod(json); // And then use the json object inside this method
mDialog.dismiss();
}
// You'll have to override this method on your other tasks that extend from this one and use your JSONObject as needed
public abstract customMethod(JSONObject json);
}
然后你的活动代码应该是这样的:
YourClassExtendingJSONTask task = new YourClassExtendingJSONTask();
task.execute(url);
您没有执行任务。 你只是在创造它。 我想你需要做:
Get g = new Get();
g.execute();
但是你以错误的方式使用任务的生命周期。 OnPostExecute在主线程上运行,您应该根据需要执行所有更新。 例如,您可以将任务传递给View。
通过调用Get对象上的execute()函数,您似乎永远不会实际启动AsyncTask。
试试这段代码:
Get g = new Get();
g.execute();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.