0

我有一段代码通过简单地调用一些 URL 来设置一些网络 IP 摄像机参数。URL(为了简化)采用这种格式“http://mydomain.com:portnumber/setalarm.cgi”,我使用普通的 HttpGet / HttpResponse 机制来调用 URL 并获取结果状态(如果好,则为 200,如果不好,则为其他)。现在:由于要调用的 URL 是 8 个或更多,因此按顺序(我使用 for 循环),我想显示一个进度条(或简单的进度指示器),让用户知道正在执行不同的 URL 调用。当所有 8 次调用都完成后,我希望显示一个带有结果的新活动(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

4 回答 4

1

只需使用AsyncTask ..

  • 将启动ProgressDialog代码放在onPreExecute()AsyncTask..
  • 将您的HttpRequest放在doInBackGround()AsyncTask 中。
  • 现在删除(关闭)ProgressDailogonPostExecute()并在onPostExecute().

简单的..

于 2012-08-23T12:04:05.647 回答
0

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

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

于 2012-08-23T12:03:40.920 回答
0

我建议阅读有关 AsyncTask 的内容。查看本教程 (http://www.vogella.com/articles/AndroidPerformance/article.html#asynctask)中的一个很好的示例,几乎完全可以说明您正在尝试做什么。

于 2012-08-23T12:05:51.077 回答
0

您不能在 UI 线程中执行超过 5 秒的操作。为此使用异步任务

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

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

脚步 :

  1. 调用异步任务以获得第一个 http 请求。
  2. 当任务完成时,从 post execute 部分编写代码来调用其相应的完成侦听器。
  3. 从已完成的侦听器开始,开始下一个 http 请求并更新进度。
  4. 只要提出所有请求,就继续。
于 2012-08-23T12:18:21.783 回答