java - 在文件上传期间显示带有百分比的水平进度条的最佳方式?
问题描述
我是 android 新手,正在尝试一个简单的图像上传应用程序。我能够使用 asynctask 完成所有上传,并且工作正常。我目前正在显示简单的进度对话框,一切都很好,但我想用进度条显示百分比。我正在使用 asynctask 进行上传,但不知道显示百分比。任何人都可以帮我做吗?
我的代码如下
public void UploadImageToServer(){
FixBitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
byteArray = byteArrayOutputStream.toByteArray();
ConvertImage = Base64.encodeToString(byteArray, Base64.DEFAULT);
class AsyncTaskUploadClass extends AsyncTask<Void,Void,String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = ProgressDialog.show(MainActivity.this,"Image is Uploading","Please Wait",false,false);
}
@Override
protected void onPostExecute(String string1) {
super.onPostExecute(string1);
progressDialog.dismiss();
Toast.makeText(MainActivity.this,string1,Toast.LENGTH_LONG).show();
}
@Override
protected String doInBackground(Void... params) {
ImageProcessClass imageProcessClass = new ImageProcessClass();
HashMap<String,String> HashMapParams = new HashMap<String,String>();
HashMapParams.put(ImageTag, GetImageNameFromEditText);
HashMapParams.put(ImageName, ConvertImage);
String FinalData = imageProcessClass.ImageHttpRequest(URL, HashMapParams);
return FinalData;
}
}
AsyncTaskUploadClass AsyncTaskUploadClassOBJ = new AsyncTaskUploadClass();
AsyncTaskUploadClassOBJ.execute();
}
public class ImageProcessClass{
public String ImageHttpRequest(String requestURL,HashMap<String, String> PData) {
StringBuilder stringBuilder = new StringBuilder();
try {
url = new URL(requestURL);
httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setReadTimeout(20000);
httpURLConnection.setConnectTimeout(20000);
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setDoInput(true);
httpURLConnection.setDoOutput(true);
outputStream = httpURLConnection.getOutputStream();
bufferedWriter = new BufferedWriter(
new OutputStreamWriter(outputStream, "UTF-8"));
bufferedWriter.write(bufferedWriterDataFN(PData));
bufferedWriter.flush();
bufferedWriter.close();
outputStream.close();
RC = httpURLConnection.getResponseCode();
if (RC == HttpsURLConnection.HTTP_OK) {
bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
stringBuilder = new StringBuilder();
String RC2;
while ((RC2 = bufferedReader.readLine()) != null){
stringBuilder.append(RC2);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return stringBuilder.toString();
}
private String bufferedWriterDataFN(HashMap<String, String> HashMapParams) throws UnsupportedEncodingException {
stringBuilder = new StringBuilder();
for (Map.Entry<String, String> KEY : HashMapParams.entrySet()) {
if (check)
check = false;
else
stringBuilder.append("&");
stringBuilder.append(URLEncoder.encode(KEY.getKey(), "UTF-8"));
stringBuilder.append("=");
stringBuilder.append(URLEncoder.encode(KEY.getValue(), "UTF-8"));
}
return stringBuilder.toString();
}
}
谢谢!
解决方案
有一个用于进度更新的内置机制AsyncTask
。访问它所需要做的就是onProgressUpdate
在AsyncTask
. 它以可用于更新 UI 的参数的形式获取进度。考虑到AsyncTask
在后台线程中运行并且您需要使用进度更新 UI 线程,您可以publishProgress
从您的调用doInBackground
which 使进度更新在 UI 线程上运行。
protected void onProgressUpdate(String... progress) {
progressDialog.setProgress(Integer.parseInt(progress[0]));
}
推荐阅读
- html - 如何在 HTML 中为段落着色?
- mysql - 我不明白两个查询之间 EXPLAIN 输出的区别。唯一的区别是 MYSQL 中的 LEFT JOIN 与 INNER JOIN
- drupal - Drupal 升级后 Drupal 模块丢失
- eclipse - 在 STS 中安装 Mac os Lombok
- javascript - 从地图文件中获取上下文
- java - 将本地时间转换为 EST 时区
- image-processing - 如何检查图像是否为损坏的图像?
- unity3d - 为什么 Input.MouseButtonDown 和 OnPointerClicked 不在同一帧中触发?
- javascript - 如何使动画完全可见html
- jekyll-paginator - Paginator 不在 github 页面上工作,但它在 localhost 上工作