1

我正在使用一个需要后台处理的应用程序,如下所示。

每当我将请求发送到 URL 时,我都会得到 JSON 格式的输出。在 JSON 中,我有一个布尔变量。如果布尔变量是true,我需要再次将请求发送到 URL,直到我得到布尔变量的值false

但在前台,SplashScreen 应该与进度条一起运行。我怎样才能做到这一点。

有什么建议么?

4

3 回答 3

1

您可以使用AsyncTask<>来实现这一点。您可以在以下网址了解更多信息:http ://www.vogella.com/articles/AndroidPerformance/article.html

你的想法的流程可以是这样的:

  1. 使用进度条启动启动活动。
  2. 在内部onCreate()启动 AsyncTask 以获取 JSON,并更新onProgressUpdate()AsyncTask 函数中的进度条。
    • 当 AsyncTask 完成 [ onPostExecute(..)] 时,调用一个函数来解析 JSON,并检查true/false
    • 如果true然后再次重复该任务。
    • 如果为 false,则停止 AsyncTask。
  3. 现在您的 URL 获取任务已完成,您可以进入下一个活动。

您也可以使用自定义的ProgressDialog

于 2012-04-23T11:59:43.950 回答
1

使用 AsyncTask,这是一个非常强大的工具,但可能像其他技术一样复杂...... AsynchTask 使用泛型类型。有一种你必须实现的方法。

protected T doInBackground(T... params) {
   // body of your method
}

和其他方法。通常

protected T doInBackground {}
protected void onProgressUpdate(T... params)
protected void onPostExecute(T param)

首先 T 服务于一些输入数据。在您的情况下,它可以是您的 URL,例如。这个方法(doInBackground)在后台线程上运行,我上面的同事是如何写的,他们可能写了所有的东西。很少有类似的例子它看起来如何:

private class DownloadAsyncTask extends AsyncTask<String, DataTransmitted, InputStream> {
      protected InputStream doInBackground(String... params) {

            int contentLength = 0;
            int buffLength = 0;
            int progress = 0;
            InputStream inputStream = null;
            try {

                URL url = new URL(params[0]);
                HttpURLConnection urlConntection = (HttpURLConnection) url.openConnection();
                urlConntection.setRequestMethod("GET");
                urlConntection.setAllowUserInteraction(false);
                urlConntection.setInstanceFollowRedirects(true);
                urlConntection.connect();
                if (urlConntection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    contentLength = urlConntection.getContentLength();
                    progressDialog.setMax(contentLength);
                    inputStream = urlConntection.getInputStream();

                    while ((buffLength = inputStream.read(MAX_BUFFER)) != -1) {
                        try {
                            Thread.sleep(1);
                            progress += buffLength;
                            DataTransmitted data = new DataTransmitted(progress, contentLength);
                            publishProgress(data);
                        }
                        catch (InterruptedException ex) {
                            Log.e(this.getClass().getName(), ex.getMessage());
                        }
                    }

                }
                else {
                    throw new IOException("No response.");
                }

            }
            catch (MalformedURLException ex) {
                Log.e(this.getClass().getName(), ex.getMessage());
            }
            catch (IOException ex) {
                Log.e(this.getClass().getName(), ex.getMessage());
            }
            return inputStream;
        }

      @Override
        protected void onProgressUpdate(DataTransmitted... data) {

            progressDialog.setProgress(data[0].getProgress());
            progressDialog.setMessage(data[0].getProgress() + " bytes downloaded.");
            data[0] = null;
        }


        @Override
        protected void onPostExecute(InputStream inStream) {
            progressDialog.dismiss();
            progressDialog.setProgress(0);
            DownloadedStream.inputStream = inStream;
            DownloadedStream.test = "Toto je len test...";
            Thread.currentThread().interrupt();
            downloadTask = null;
            new AlertDialog.Builder(DownloadPictureActivity.this)
                .setTitle("Download finished")
                .setMessage("Picture was downloaded correctly.")
                .setPositiveButton("Zobraziť", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dlg, int whichButton) {
                        // body of method

                    }
                })
                .setNegativeButton("Zavrieť", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dlg, int whichButton) {
                     //body of method   
                    } 
                })
                .show();
        }
}

希望能帮助到你!

于 2012-04-23T12:36:49.553 回答
1

当进度条在 ui 线程上运行时,使用 aynctask 或单独的线程在服务器上获取数据。

于 2012-04-23T11:46:24.720 回答