在HttpClient上应用Asynctask

时间:2014-12-08 09:03:25

标签: java android android-asynctask

我之前没有使用AsyncTask,也没有理解有关它的一些教程,所以我真的不知道如何将它应用于HttpClient执行。请帮助我完成这种实现,这是最初的代码:

public void commandModule(String url) {
 try {
    HttpClient httpClient = new DefaultHttpClient();
    httpClient.execute(new HttpGet(url));

 } catch (Exception e) {

 }

}


@Override
public void onClick(View v) {
if (checkBox1.isChecked()) {
    commandModule("http://192.168.1.102/?command1");
} else {
    commandModule("http://192.168.1.102/?command2");
}

if (checkBox2.isChecked()) {
    commandModule("http://192.168.1.102/?command3");
} else {
    commandModule("http://192.168.1.102/?command4");
}

}

4 个答案:

答案 0 :(得分:1)

如果您了解java中的Thread,您将很容易理解android中的Async Task的工作情况。基本上,你不能在android的主线程上执行任何长时间运行的任务。它将阻止主要主线程,你将得到ANR(Applicaton not responding)错误。要避免这种情况,您可以使用线程或异步任务。 线程有一个限制,你无法更新任何其他线程的UI线程。因此,要更新UI,您需要使用处理程序将消息发送到main / UI线程。每次使用线程实现某些操作时,您都必须这样做。 为了简化,android框架提供了异步任务。

所以,你应该在线程的run()方法中放入什么,应该进入doInBackground()方法。

答案 1 :(得分:0)

public void commandModule(String url) {
        new RequestTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,url);

}


private class RequestTask extends AsyncTask<String,Void,Void>{
    protected void doInBackground(String... args){

        String url=args[0];
        try {
            HttpClient httpClient = new DefaultHttpClient();
            httpClient.execute(new HttpGet(url));
        } catch (Exception e) {

        }

    }
}

答案 2 :(得分:0)

AsyncTask可以正确,轻松地使用UI线程。此类允许执行后台操作并在UI线程上发布结果,而无需操作线程和/或处理程序。 查看本教程,它将提供有关您的查询的提示http://programmerguru.com/android-tutorial/android-asynctask-example/

答案 3 :(得分:0)

AsyncTask可以正确,轻松地使用UI线程。该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。

public void commandModule(String url) {
 try {
 new RequestTask().execute(url);

} catch (Exception e) {

}

}


@Override
public void onClick(View v) {
if (checkBox1.isChecked()) {
commandModule("http://192.168.1.102/?command1");
} else {
commandModule("http://192.168.1.102/?command2");
}

if (checkBox2.isChecked()) {
commandModule("http://192.168.1.102/?command3");
} else {
commandModule("http://192.168.1.102/?command4");
}

}

private class RequestTask extends AsyncTask<String,Void,Void>{

 @Override
        protected void onPreExecute() {
            super.onPreExecute();

        }
protected void doInBackground(String... args){

    String url=args[0];
    try {
        HttpClient httpClient = new DefaultHttpClient();
        httpClient.execute(new HttpGet(url));
    } catch (Exception e) {

    }

}

@Override
        protected void onPostExecute() {


        }
}
  1. onPreExecute() - 在commandModule()中调用execute()方法时执行(简而言之,当触发AsyncTask时)。
  2. doInBackground() - 在onPreExecute()完成执行时执行。这里处理的任务很长
  3. onPostExecute() - 后台作业已完成