在打开新活动之前,使用进度条发出HTTP请求:如何?

时间:2012-08-23 12:01:20

标签: android eclipse multithreading progress-bar

我有一段代码通过简单地调用一些URL来设置一些网络IP摄像机参数。 URL(以简化)以这种格式“http://mydomain.com:portnumber/setalarm.cgi”,我使用普通的HttpGet / HttpResponse机制来调用URL并获得结果状态(如果它是好的200,其他如果不好) )。 现在:由于要调用的URL是8或更多,按顺序(我用于循环),我想显示一个进度条(或简单的进度指示器),让用户知道正在执行不同的URL调用。当所有8个调用完成后,我希望显示一个新的Actity结果(OK,或KO以及KO凸轮列表)。

我在这个网站上找到了很多解决方案,但没有一个成功的解决方案(线程,进度条,对话栏,异步任务等)。要么我得到例外,要么没有显示栏,要么在完成流程之前显示新的活动。

有人可以帮忙吗?这是我现在代码的相关部分:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mainlayout);

    // ON button
    Button myButton1 = (Button) findViewById (R.id.button1);
    myButton1.setOnClickListener(new OnClickListener() {            

        public void onClick(final View arg0) {

            intGoodCamera = 0;
            intBadCamera = 0;

            for (int i = 0; i<intNumCam; i++) {

                System.out.println (intStartingPortNb+i);

                String myurl = strIPAddress + ":" + (intStartingPortNb+i) + strSuffixSetAlarmOn;
                HttpClient httpClient = new DefaultHttpClient();
                HttpContext localContext = new BasicHttpContext();
                HttpGet httpGet = new HttpGet(myurl);
                HttpResponse response = null;
                try {

                    response = httpClient.execute(httpGet, localContext);
                    System.out.println (response.getStatusLine().getStatusCode());
                    if (response.getStatusLine().getStatusCode() == 200) 
                        intGoodCamera++;
                    else {
                        intBadCamera++;
                    }
                } catch (ClientProtocolException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            System.out.println ("OK: "+intGoodCamera + " KO: "+ intBadCamera);
            Intent nextIntent = new Intent(MainActivity.this, Results.class);
            MainActivity.this.startActivity(nextIntent);
        }
    });

.....

4 个答案:

答案 0 :(得分:1)

只需使用AsyncTask ..

  • 在AsyncTask的onPreExecute()中放置 ProgressDialog 代码..
  • HttpRequest 放在AsyncTask的doInBackGround()中。
  • 现在删除(解除)onPostExecute()中的 ProgressDailog onPostExecute()
  • 中开始新的活动

简单..

答案 1 :(得分:0)

我认为你的问题是你在UI线程中放置了http请求,这是自Android 3.0以来禁止的

我认为你应该检查这个链接: httpGet Request error

答案 2 :(得分:0)

我建议阅读有关AsyncTask的内容。看看this tutorial (http://www.vogella.com/articles/AndroidPerformance/article.html#asynctask),看看你几乎要做的一个很好的例子。

答案 3 :(得分:0)

您无法在UI线程中执行超过5秒的操作。 对于那个使用Async Task

在上一个http请求完成后调用下一个http请求(因为任务正在运行Async)并更新进度条。

最好使用侦听器接口来处理异步任务完成

步骤:

  1. 调用异步任务以获得第一个http请求。
  2. 当任务完成时,从后执行部分编写代码以调用其相应的完成侦听器。
  3. 从已完成的侦听器中,启动下一个http请求并更新进度。
  4. 继续所有请求。