- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我应该如何使用上传按钮显示我在 android 中上传的每个文件的进度条,如下所示:
我已经尝试使用服务和通知来这样做,但我想在 UI 本身中显示进度。
任何代码示例都会有所帮助。
我正在使用以下类进行分段上传:
public class MultipartUtility
{
FileUploadListener listener;
private static final int BUFFER_SIZE = 1024;
private static final int TIME_OUT = 3 * 60 * 1000;
private final String boundary;
private static final String LINE_FEED = "\r\n";
private HttpURLConnection httpConn;
private String charset;
private OutputStream outputStream;
private PrintWriter writer;
public int statusCode;
public String mURL;
public interface FileUploadListener {
void onUpdateProgress(int percentage, long kb);
boolean isCanceled();
}
/**
* This constructor initializes a new HTTP POST request with content type
* is set to multipart/form-data
*
* @param requestURL
* @param charset
* @throws IOException
*/
public MultipartUtility(Context context, String requestURL, String charset, FileUploadListener listener)
throws IOException {
this.charset = charset;
this.listener = listener;
mURL = requestURL;
// creates a unique boundary based on time stamp
boundary = "" + System.currentTimeMillis() + "";
URL url = new URL(requestURL);
httpConn = null;
if (url.getProtocol().toLowerCase().equals("https")) {
trustAllHosts();
HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
https.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
httpConn = https;
} else {
httpConn = (HttpURLConnection) url.openConnection();
}
// httpConn.setConnectTimeout(TIME_OUT);
//httpConn.setReadTimeout(TIME_OUT);
httpConn.setUseCaches(false);
httpConn.setDoOutput(true); // indicates POST method
httpConn.setDoInput(true);
httpConn.setChunkedStreamingMode(BUFFER_SIZE);
httpConn.setRequestMethod("POST");
Storage storage = new Storage(context);
httpConn.setRequestProperty("x-auth", storage.readString("user_token"));
httpConn.setRequestProperty("Content-Type",
"multipart/form-data; boundary=" + boundary);
httpConn.setRequestProperty("Connection", "Keep-Alive");
outputStream = httpConn.getOutputStream();
writer = new PrintWriter(new OutputStreamWriter(outputStream, charset),
true);
}
private static void trustAllHosts() {
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
}};
// Install the all-trusting trust manager
try {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Adds a form field to the request
*
* @param name field name
* @param value field value
*/
public void addFormField(String name, String value) {
writer.append("--" + boundary).append(LINE_FEED);
writer.append("Content-Disposition: form-data; name=\"" + name + "\"")
.append(LINE_FEED);
writer.append("Content-Type: text/plain; charset=" + charset).append(
LINE_FEED);
writer.append(LINE_FEED);
writer.append(value).append(LINE_FEED);
writer.flush();
}
/**
* Adds a upload file section to the request
*
* @param fieldName name attribute in <input type="file" name="..." />
* @param uploadFile a File to be uploaded
* @throws IOException
*/
private long lastProgressUpdateTime = 0;
public void addFilePart(String fieldName, File uploadFile)
throws IOException {
String fileName = uploadFile.getName();
writer.append("--" + boundary).append(LINE_FEED);
writer.append(
"Content-Disposition: form-data; name=\"" + fieldName
+ "\"; filename=\"" + fileName + "\"")
.append(LINE_FEED);
writer.append(
"Content-Type: "
+ URLConnection.guessContentTypeFromName(fileName))
.append(LINE_FEED);
writer.append("charset=" + charset).append(
LINE_FEED);
writer.append(LINE_FEED);
writer.flush();
outputStream.flush();
byte[] buffer = new byte[BUFFER_SIZE];
try {
final FileInputStream inputStream = new FileInputStream(uploadFile);
long totalRead = 0;
long totalSize = uploadFile.length();
int read;
while ((read = inputStream.read(buffer)) > 0) {
totalRead += read;
int percentage = (int) ((totalRead / (float) totalSize) * 100);
outputStream.write(buffer, 0, read);
long now = System.currentTimeMillis();
if (lastProgressUpdateTime == 0 || lastProgressUpdateTime < now - 100) {
lastProgressUpdateTime = now;
Log.e("", totalRead + " " + " " + percentage);
if (listener != null)
this.listener.onUpdateProgress(percentage, totalRead);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
outputStream.flush();
}
writer.append(LINE_FEED);
writer.flush();
}
/**
* Adds a header field to the request.
*
* @param name - name of the header field
* @param value - value of the header field
*/
public void addHeaderField(String name, String value) {
writer.append(name + ": " + value).append(LINE_FEED);
writer.flush();
}
/**
* Completes the request and receives response from the server.
*
* @return a list of Strings as response in case the server returned
* status OK, otherwise an exception is thrown.
* @throws IOException
*/
public String Execute() throws IOException {
String responses = "";
writer.append(LINE_FEED).flush();
writer.append("--" + boundary + "--").append(LINE_FEED);
writer.close();
StringBuilder sb = new StringBuilder();
try {
// checks server's status code first
statusCode = httpConn.getResponseCode();
//responses = ;
sb.append("" + Helpers.convertStreamToString(httpConn.getInputStream()) + "\n");
if (statusCode == HttpURLConnection.HTTP_OK) {
httpConn.disconnect();
}
responses = sb.toString();
return responses;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
sb = new StringBuilder();
sb.append("" + Helpers.convertStreamToString(httpConn.getErrorStream()) + "\n");
responses = sb.toString();
}
return responses;
}
}
最佳答案
为此创建一个单例设计,并为每个下载文件在 HashMap 条目中创建一个具有键值的条目。例如对于 file1 应该有一个键,值应该是它的更新进度。并根据文件上传进度(当收到进度更新的回调时)针对 key 更新该条目。并且还根据键从该 HashMap 更新进度条。因为您的 HashMap 将始终具有更新的值。希望有所帮助。在我的一个项目中,我实现了同样的事情。我现在分享这个
创建下载服务
public class DownloadService extends IntentService {
public DownloadService() {
super("DownloadService");
}
@Override
protected void onHandleIntent(Intent intent) {
String rhymeName = intent.getStringExtra(Constants.RHYME_NAME);
String URL = intent.getStringExtra(Constants.URL);
downloadRhyme(rhymeName, URL);
}
private void sendMyBroadCast(long currentProgress, long totalVideoSize, String rhymeName) {
Intent intentUpdate = new Intent();
intentUpdate.setAction(Constants.ACTION_MYUPDATE);
intentUpdate.addCategory(Intent.CATEGORY_DEFAULT);
intentUpdate.putExtra(Constants.UPDATED_VALUES, currentProgress);
intentUpdate.putExtra(Constants.TOTAL_VIDEO_SIZE, totalVideoSize);
intentUpdate.putExtra(Constants.RHYME_NAME, rhymeName);
sendBroadcast(intentUpdate);
}
private void registerMyTaskCompletedListener(ITaskCompletedListener taskCompletedListener, boolean successful, String rhymeName) {
if (successful)
taskCompletedListener.taskCompleted(rhymeName);
else
taskCompletedListener.taskFailed(rhymeName);
}
private final void downloadRhyme(String rhymeName, String URL) {
boolean successful = false;
URL downloadURL = null;
HttpURLConnection httpURLConnection = null;
InputStream inputStream = null;
FileOutputStream fileOutputStream = null;
File file = null;
try {
downloadURL = new URL(URL);
httpURLConnection = (HttpURLConnection) downloadURL.openConnection();
int responseCode = httpURLConnection.getResponseCode();
if (responseCode != HttpURLConnection.HTTP_OK)
return;
inputStream = httpURLConnection.getInputStream();
file = AppUtility.getInternalDirectoryForRhymes(this, rhymeName);
fileOutputStream = new FileOutputStream(file);
int read = -1;
long totalRead =0 ;
int totalLength = httpURLConnection.getContentLength();
byte [] buffer = new byte[1024];
while ((read = inputStream.read(buffer)) != -1) {
totalRead += read;
fileOutputStream.write(buffer, 0, read);
sendMyBroadCast(totalRead, totalLength, rhymeName);
}
successful = true;
UrduRhymesActivity.getInstance().unregisterMyReceiver();
callListener(successful, rhymeName);
} catch (Exception e) {
if (e instanceof SocketTimeoutException) {
ProgressReceiver.showSocketConnectionDialogue();
}
callListener(successful, rhymeName);
} finally {
if (httpURLConnection != null) {
httpURLConnection.disconnect();
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private void callListener(boolean successful, String rhymeName) {
ITaskCompletedListener taskCompletedListener = new ProgressReceiver();
registerMyTaskCompletedListener(taskCompletedListener, successful, rhymeName);
}
下面是进度接收器
公共(public)类 ProgressReceiver 扩展 BroadcastReceiver 实现 ITaskCompletedListener {
@Override
public void onReceive(Context context, Intent intent) {
long currentProgress = intent.getLongExtra(Constants.UPDATED_VALUES, 0);
long totalSize = intent.getLongExtra(Constants.TOTAL_VIDEO_SIZE, 0);
String rhymeName = intent.getStringExtra(Constants.RHYME_NAME);
ProgressbarDetails progressbarDetails = ProgressbarDetails.getProgressDetail(rhymeName);
if (progressbarDetails != null) {
int updates = ((int) ((currentProgress / (float) totalSize) * 100));
progressbarDetails.prgProgressBar.setVisibility(View.VISIBLE);
progressbarDetails.prgProgressBar.setProgress(updates);
LogUtility.infoLog("current downloaded file size is " + currentProgress);
LogUtility.infoLog("total file size " + totalSize);
LogUtility.infoLog("After conversion " + updates);
}
}
@Override
public void taskCompleted(String rhymeName) {
runThread(rhymeName);
}
private void runThread(final String rhymeName) {
UrduRhymesActivity.getInstance().runOnUiThread(new Runnable() {
@Override
public void run() {
ProgressbarDetails progressbarDetails = ProgressbarDetails.getProgressDetail(rhymeName);
progressbarDetails.download_btn_settings.setBackgroundResource(R.mipmap.btn_play);
progressbarDetails.prgProgressBar.setVisibility(View.GONE);
ProgressbarDetails.deleteUpdateProgressDetail(rhymeName);
}
});
}
public static void showSocketConnectionDialogue() {
UrduRhymesActivity.getInstance().runOnUiThread(new Runnable() {
@Override
public void run() {
//[Case:When server is down]
AppUtility.showConnectionDialoge(UrduRhymesActivity.sUrduRhymesActivity);
}
});
}
@Override
public void taskFailed(String rhymeName) {
boolean deleteStatus = false;
if (rhymeName != null)
deleteStatus = AppUtility.deleteFileFromInternalDirectory(MyApplication.getAppContext(), rhymeName);
if (deleteStatus)
LogUtility.infoLog("file deleted Successfully");
else LogUtility.infoLog("File not deleted");
ProgressbarDetails.deleteUpdateProgressDetail(rhymeName);
}
这是跟踪下载状态的主要代码。
public class ProgressbarDetails {
public ProgressBar prgProgressBar;
public int progress;
public LinearLayout download_btn_settings;
private static HashMap<String, ProgressbarDetails> progressMapper = null;
public static HashMap<String, ProgressbarDetails> getProgressMapper() {
if(progressMapper == null)
progressMapper = new HashMap<>();
return progressMapper;
}
public static ProgressbarDetails getProgressDetail(String rhymeName) {
Object obj = getProgressMapper().get(rhymeName);
ProgressbarDetails ProgressbarDetails = null;
if (obj != null)
ProgressbarDetails = (ProgressbarDetails) obj;
return ProgressbarDetails;
}
public static void addUpdateProgressDetail(String rhymeName, ProgressbarDetails prgBarDetail) {
progressMapper = getProgressMapper();
progressMapper.put(rhymeName, prgBarDetail);
}
public static void deleteUpdateProgressDetail(String rhymeName) {
progressMapper = getProgressMapper();
if(progressMapper.containsKey(rhymeName))
progressMapper.remove(rhymeName);
}
希望对您有所帮助。
关于android - 如何分别显示多个上传的上传进度 - Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44879196/
我的Angular-Component位于一个flexbox(id =“log”)中。可以显示或隐藏flexbox。 我的组件内部有一个可滚动区域,用于显示日志消息。 (id =“message-li
我真的很困惑 有一个 phpinfo() 输出: MySQL 支持 启用 客户端 API 版本 5.5.40 MYSQL_MODULE_TYPE 外部 phpMyAdmin 显示: 服务器类型:Mar
我正在研究这个 fiddle : http://jsfiddle.net/cED6c/7/我想让按钮文本在单击时发生变化,我尝试使用以下代码: 但是,它不起作用。我应该如何实现这个?任何帮助都会很棒
我应该在“dogs_cats”中保存表“dogs”和“cats”各自的ID,当看到数据时显示狗和猫的名字。 我有这三个表: CREATE TABLE IF NOT EXISTS cats ( id
我有一个字符串返回到我的 View 之一,如下所示: $text = 'Lorem ipsum dolor ' 我正在尝试用 Blade 显示它: {{$text}} 但是,输出是原始字符串而不是渲染
我无法让我的链接(由图像表示,位于页面左侧)真正有效地显示一个 div(包含一个句子,位于中间)/单击链接时隐藏。 这是我的代码: Practice
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
最初我使用 Listview 来显示 oracle 结果,但是最近我不得不切换到 datagridview 来处理比 Listview 允许的更多的结果。然而,自从切换到数据网格后,我得到的结果越来越
我一直在尝试插入一个 Unicode 字符 ∇ 或 ▽,所以它显示在 Apache FOP 生成的 PDF 中。 这是我到目前为止所做的: 根据这个基本帮助 Apache XSL-FO Input,您
我正在使用 node v0.12.7 编写一个 nodeJS 应用程序。 我正在使用 pm2 v0.14.7 运行我的 nodejs 应用程序。 我的应用程序似乎有内存泄漏,因为它从我启动时的大约 1
好的,所以我有一些 jQuery 代码,如果从下拉菜单中选择了带有前缀 Blue 的项目,它会显示一个输入框。 代码: $(function() { $('#text1').hide();
当我试图检查 Chrome 中的 html 元素时,它显示的是 LESS 文件,而 Firefox 显示的是 CSS 文件。 (我正在使用 Bootstrap 框架) 如何在 Chrome 中查看 c
我是 Microsoft Bot Framework 的新手,我正在通过 youtube 视频 https://youtu.be/ynG6Muox81o 学习它并在 Ubuntu 上使用 python
我正在尝试转换从 mssql 生成的文件到 utf-8。当我打开他的输出 mssql在 Windows Server 2003 中使用 notepad++ 将文件识别为 UCS-2LE我使用 file
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在尝试执行单击以打开/关闭一个 div 的功能。 这是基本的,但是,点击只显示 div,当我点击“关闭”时,没有任何反应。 $(".inscricao-email").click(function
假设我有 2 张卡片,屏幕上一次显示一张。我有一个按钮可以用其他卡片替换当前卡片。现在假设卡 1 上有一些数据,卡 2 上有一些数据,我不想破坏它们每个上的数据,或者我不想再次重建它们中的任何一个。
我正在使用 Eloquent Javascript 学习 Javascript。 我在 Firefox 控制台上编写了以下代码,但它返回:“ReferenceError:show() 未定义”为什么?
我正在使用 Symfony2 开发一个 web 项目,我使用 Sonata Admin 作为管理面板,一切正常,但我想要做的是,在 Sonata Admin 的仪表板菜单上,我需要显示隐藏一些菜单取决
我试图显示一个div,具体取决于从下拉列表中选择的内容。例如,如果用户从列表中选择“现金”显示现金div或用户从列表中选择“检查”显示现金div 我整理了样本,但样本不完整,需要接线 http://j
我是一名优秀的程序员,十分优秀!