【问题标题】:Make HTTP requests with progress bar, before opening a new Activity: how?在打开新活动之前使用进度条发出 HTTP 请求:如何?
【发布时间】:2012-08-23 12:01:19
【问题描述】:

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

我尝试了许多解决方案,在这个站点上找到了,但没有一个成功(线程、进度条、对话框栏、异步任务等)。要么我得到异常,要么栏不显示,要么在流程完成之前显示新的 Activity。

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

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);
        }
    });

.....

【问题讨论】:

    标签: android eclipse multithreading progress-bar


    【解决方案1】:

    只需使用AsyncTask..

    • 将起始ProgressDialog代码放在AsyncTask的onPreExecute()中..
    • 将您的 HttpRequest 放入 AsyncTask 的 doInBackGround()
    • 现在删除(关闭)onPostExecute() 中的 ProgressDailog 和 在onPostExecute() 中启动一个新活动。

    简单..

    【讨论】:

      【解决方案2】:

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

      我认为您应该检查此链接: httpGet Request error

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          您不能在 UI 线程中执行耗时超过 5 秒的操作。 为此使用Async Task

          上一个http请求完成后调用下一个http请求(因为任务是异步运行的)并更新进度条。

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

          步骤:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-10
            • 2020-09-07
            • 1970-01-01
            相关资源
            最近更新 更多