我正在使用一个需要后台处理的应用程序,如下所示。
每当我将请求发送到 URL 时,我都会得到 JSON 格式的输出。在 JSON 中,我有一个布尔变量。如果布尔变量是true
,我需要再次将请求发送到 URL,直到我得到布尔变量的值false
。
但在前台,SplashScreen 应该与进度条一起运行。我怎样才能做到这一点。
有什么建议么?
我正在使用一个需要后台处理的应用程序,如下所示。
每当我将请求发送到 URL 时,我都会得到 JSON 格式的输出。在 JSON 中,我有一个布尔变量。如果布尔变量是true
,我需要再次将请求发送到 URL,直到我得到布尔变量的值false
。
但在前台,SplashScreen 应该与进度条一起运行。我怎样才能做到这一点。
有什么建议么?
您可以使用AsyncTask<>
来实现这一点。您可以在以下网址了解更多信息:http ://www.vogella.com/articles/AndroidPerformance/article.html
你的想法的流程可以是这样的:
onCreate()
启动 AsyncTask 以获取 JSON,并更新onProgressUpdate()
AsyncTask 函数中的进度条。
onPostExecute(..)
] 时,调用一个函数来解析 JSON,并检查true
/false
值true
然后再次重复该任务。您也可以使用自定义的ProgressDialog
。
使用 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();
}
}
希望能帮助到你!
当进度条在 ui 线程上运行时,使用 aynctask 或单独的线程在服务器上获取数据。