- 浏览: 186842 次
- 性别:
- 来自: 浙江
-
文章分类
最新评论
有些地方需要用到像下载时用到的进度条,我这里简单的做了个demo。
布局文件activity_main.xml如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:padding="10dp">
<Button
android:id="@+id/btnAddPro"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加进程"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/llPro"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"/>
</ScrollView>
</LinearLayout>
接着就是往llPro中添加view,view的布局unit_process.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp">
<TextView
android:id="@+id/tv_rate"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="" />
<TextView
android:id="@+id/tv_name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<ProgressBar
android:id="@+id/down_pb"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:max="100" />
</LinearLayout>
代码实现:
package com.lml.process;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import org.apache.http.client.ClientProtocolException;
import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
Button btnAdd;
LinearLayout llPro;
private int num=0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
llPro=(LinearLayout)findViewById(R.id.llPro);
btnAdd=(Button)findViewById(R.id.btnAddPro);
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
final View view = inflater.inflate(R.layout.unit_process, null);
llPro.addView(view);
String source = "http://image.baidu.com/i?tn=download&ipn=dwnl&word=%E5%9B%BE%E7%89%87%E4%B8%8B%E8%BD%BD&ie=utf-8&fr=result&url=http%3A%2F%2Fimg2.pcpop.com%2FArticleImages%2F0x0%2F1%2F1061%2F001061672.jpg";
AsyTask at=new AsyTask(MainActivity.this,view,source);
at.execute();
}
});
}
private Handler handler = new Handler() {
ProgressBar pb;
TextView tv_rate,tv_name;
@Override
public void handleMessage(Message msg) {
// 定义一个Handler,用于处理下载线程与UI间通讯
if (!Thread.currentThread().isInterrupted()) {
Object[] data= (Object[])(msg.obj);
View view =(View) data[0];
switch (msg.what) {
case 0:
pb=(ProgressBar)view.findViewById(R.id.down_pb);
tv_name=(TextView)view.findViewById(R.id.tv_name);
pb.setMax((Integer)data[1]);
tv_name.setText((String)data[2]);
break;
case 1:
pb=(ProgressBar)view.findViewById(R.id.down_pb);
tv_rate=(TextView)view.findViewById(R.id.tv_rate);
pb.setProgress((Integer)data[2]);
int result = (Integer)data[2] * 100 /(Integer) data[1];
tv_rate.setText(result + "%");
break;
case 2:
Toast.makeText(MainActivity.this, "文件下载完成", Toast.LENGTH_SHORT).show();
break;
case -1:
String error = msg.getData().getString("error");
Toast.makeText(MainActivity.this, error, Toast.LENGTH_SHORT).show();
break;
}
}
super.handleMessage(msg);
}
};
public boolean downFile(String url, String path , View view) throws IOException {
URL myURL = new URL(url);
URLConnection conn = myURL.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
URL absUrl = conn.getURL();// 获得真实Url
String filename = conn.getHeaderField("Content-Disposition");
if (filename == null || filename.length() < 1) {
filename = absUrl.getFile();
}
int fileSize = conn.getContentLength();// 根据响应获取文件大小
if (fileSize <= 0)
return false;
if (is == null)
return false;
File dir=new File(path+"/Mytext");
dir.mkdirs();
File file=new File(dir.getAbsolutePath(),"lml"+(num++)+".jpg");
if(file.exists()){
file.delete();
}
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
byte buf[] = new byte[1024];
int downLoadFileSize = 0;
Object[] data0=new Object[]{view,fileSize,filename };
sendMsg(0,data0);
do {
// 循环读取
int numread = is.read(buf);
if (numread == -1) {
break;
}
fos.write(buf, 0, numread);
downLoadFileSize += numread;
Object[] data1=new Object[]{view,fileSize,downLoadFileSize };
sendMsg(1,data1);// 更新进度条
} while (true);
Object[] data1=new Object[]{view};
sendMsg(2,data1);// 通知下载完成
try {
is.close();
fos.close();
} catch (Exception ex) {
return false;
}
return true;
}
private void sendMsg(int flag,Object[] data) {
Message msg = Message.obtain(handler,flag, 0, 0,data);
handler.sendMessage(msg);
}
class AsyTask extends AsyncTask<String, Integer, Boolean> {
Context mContext;
View view;
String source;
public AsyTask(Context context,View view,String source) {
mContext = context;
this.view=view ;
this.source=source;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Boolean doInBackground(String... arg0) {
Boolean isSuccess = false ;
try {
isSuccess = downFile(source,
Environment.getExternalStorageDirectory().getPath(),view);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return isSuccess;
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
if(!result){
llPro.removeView(view);
Toast.makeText(MainActivity.this, "下载失败!", Toast.LENGTH_LONG).show();
}
}
}
}
布局文件activity_main.xml如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:padding="10dp">
<Button
android:id="@+id/btnAddPro"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加进程"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/llPro"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"/>
</ScrollView>
</LinearLayout>
接着就是往llPro中添加view,view的布局unit_process.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp">
<TextView
android:id="@+id/tv_rate"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="" />
<TextView
android:id="@+id/tv_name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<ProgressBar
android:id="@+id/down_pb"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:max="100" />
</LinearLayout>
代码实现:
package com.lml.process;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import org.apache.http.client.ClientProtocolException;
import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
Button btnAdd;
LinearLayout llPro;
private int num=0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
llPro=(LinearLayout)findViewById(R.id.llPro);
btnAdd=(Button)findViewById(R.id.btnAddPro);
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
final View view = inflater.inflate(R.layout.unit_process, null);
llPro.addView(view);
String source = "http://image.baidu.com/i?tn=download&ipn=dwnl&word=%E5%9B%BE%E7%89%87%E4%B8%8B%E8%BD%BD&ie=utf-8&fr=result&url=http%3A%2F%2Fimg2.pcpop.com%2FArticleImages%2F0x0%2F1%2F1061%2F001061672.jpg";
AsyTask at=new AsyTask(MainActivity.this,view,source);
at.execute();
}
});
}
private Handler handler = new Handler() {
ProgressBar pb;
TextView tv_rate,tv_name;
@Override
public void handleMessage(Message msg) {
// 定义一个Handler,用于处理下载线程与UI间通讯
if (!Thread.currentThread().isInterrupted()) {
Object[] data= (Object[])(msg.obj);
View view =(View) data[0];
switch (msg.what) {
case 0:
pb=(ProgressBar)view.findViewById(R.id.down_pb);
tv_name=(TextView)view.findViewById(R.id.tv_name);
pb.setMax((Integer)data[1]);
tv_name.setText((String)data[2]);
break;
case 1:
pb=(ProgressBar)view.findViewById(R.id.down_pb);
tv_rate=(TextView)view.findViewById(R.id.tv_rate);
pb.setProgress((Integer)data[2]);
int result = (Integer)data[2] * 100 /(Integer) data[1];
tv_rate.setText(result + "%");
break;
case 2:
Toast.makeText(MainActivity.this, "文件下载完成", Toast.LENGTH_SHORT).show();
break;
case -1:
String error = msg.getData().getString("error");
Toast.makeText(MainActivity.this, error, Toast.LENGTH_SHORT).show();
break;
}
}
super.handleMessage(msg);
}
};
public boolean downFile(String url, String path , View view) throws IOException {
URL myURL = new URL(url);
URLConnection conn = myURL.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
URL absUrl = conn.getURL();// 获得真实Url
String filename = conn.getHeaderField("Content-Disposition");
if (filename == null || filename.length() < 1) {
filename = absUrl.getFile();
}
int fileSize = conn.getContentLength();// 根据响应获取文件大小
if (fileSize <= 0)
return false;
if (is == null)
return false;
File dir=new File(path+"/Mytext");
dir.mkdirs();
File file=new File(dir.getAbsolutePath(),"lml"+(num++)+".jpg");
if(file.exists()){
file.delete();
}
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
byte buf[] = new byte[1024];
int downLoadFileSize = 0;
Object[] data0=new Object[]{view,fileSize,filename };
sendMsg(0,data0);
do {
// 循环读取
int numread = is.read(buf);
if (numread == -1) {
break;
}
fos.write(buf, 0, numread);
downLoadFileSize += numread;
Object[] data1=new Object[]{view,fileSize,downLoadFileSize };
sendMsg(1,data1);// 更新进度条
} while (true);
Object[] data1=new Object[]{view};
sendMsg(2,data1);// 通知下载完成
try {
is.close();
fos.close();
} catch (Exception ex) {
return false;
}
return true;
}
private void sendMsg(int flag,Object[] data) {
Message msg = Message.obtain(handler,flag, 0, 0,data);
handler.sendMessage(msg);
}
class AsyTask extends AsyncTask<String, Integer, Boolean> {
Context mContext;
View view;
String source;
public AsyTask(Context context,View view,String source) {
mContext = context;
this.view=view ;
this.source=source;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Boolean doInBackground(String... arg0) {
Boolean isSuccess = false ;
try {
isSuccess = downFile(source,
Environment.getExternalStorageDirectory().getPath(),view);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return isSuccess;
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
if(!result){
llPro.removeView(view);
Toast.makeText(MainActivity.this, "下载失败!", Toast.LENGTH_LONG).show();
}
}
}
}
- Process.rar (1.3 MB)
- 下载次数: 0
发表评论
-
关于Android的webSocket的简单使用
2017-05-12 14:34 1013使用第三方jar: autobahn-0.5.0.jar 连 ... -
Comparator自定义排序的使用
2017-05-11 14:18 770java对于集合的自定义排序方法有: Arrays.sort ... -
查看Android虚拟机文件相关命令
2017-05-02 14:12 637我们在虚拟机下添加文件后,想查看下文件是否正确创建,可在win ... -
android6.0创建文件问题
2017-05-02 12:58 600Android在6.0有了动态权限管理,在文件创建时就需要动态 ... -
xutils的http模块的简单使用
2017-04-28 16:05 546先导入xutils相关依赖: compile 'org.xut ... -
Litepal的简单使用
2017-04-27 17:21 664相关包下载地址:https://github.com/Lite ... -
Android下拉刷新上拉加载控件的使用
2017-04-21 10:46 874参考链接:http://www.jianshu.com/p/6 ... -
图片加载框架
2017-04-19 16:29 414图片加载框架: picasso ImageLoader -
Android的Service总结
2017-04-17 15:46 482参考链接:http://www.cnblogs.com/lwb ... -
解决ViewPager的addOnPageChangeListener不加载第一个的问题
2017-03-18 17:53 2680今天在使用ViewPager的时候发现个问题。 需求如下: ... -
clone方法的使用
2017-01-04 10:14 569由于Java有引用这一说,当两个变量指向同一块内存时,改变 ... -
Fragment无法切换问题
2016-12-16 14:57 2131Android有一个回收机制,当内存不足时,会自动回收相关内存 ... -
关于Material Design的CollapsingToolbarLayout初次使用
2016-12-16 13:38 627最近了解了下CollapsingToolbarLayout的使 ... -
MVP模式的学习
2016-12-10 15:15 696以前我写代码都是使用MVC模式,这种模式使Activity变得 ... -
Material Design:Android Design Support Library 介绍
2016-12-10 14:14 521参考链接 : https://blog.leancloud.c ... -
SpannableString简介
2016-12-10 14:03 443参考链接: http://www.cnblogs.com/ji ... -
getResources().getDrawable方法的废弃
2016-12-10 13:20 1257参考链接:http://www.jianshu.com/p/e ... -
关于AndroidStudio的Unsupported major.minor version 52.0异常
2016-12-10 13:15 2389参考链接:http://blog.csdn.net/fakin ... -
Android记录
2015-06-01 10:54 668http://tools.android-studio.org ... -
android自定义控件相关使用
2015-04-24 16:53 625用代码简单介绍下自定义控件的使用: 先看主activity: ...
相关推荐
在版本更新的场景下,我们需要实时更新进度条的数值,这需要后台服务与前端UI之间的通信。通常,后台会通过网络请求获取新版本的文件,并报告下载进度。前端则需要监听这些进度更新事件,将接收到的数据反映到进度条...
本教程将深入探讨如何通过`Handler`来传递值并更新进度条。 首先,让我们理解`Handler`的基本概念。`Handler`是Android中的一个关键组件,用于在不同的线程之间发送和处理消息。它提供了发送异步消息到UI线程的方法...
本例程主要关注的是“在线更新”和“更新进度条自动替换自身”的功能,这在软件维护和升级中是非常关键的部分。 在线更新是现代软件常用的一种特性,它允许用户直接通过网络下载并安装软件的新版本,而无需卸载旧版...
FTP上传和断点续传是网络传输中两个重要的概念,特别是在大文件传输场景下,而更新进度条则是提升用户体验的关键元素。在这个公司项目的第一个版本中,我们关注的是如何实现一个功能完善的FTP上传系统,该系统支持...
然而,在单线程环境中,如果更新进度条的操作与执行耗时任务在同一线程上,可能会导致应用程序界面无响应,也就是所谓的“假死”现象。用户看到的界面会卡住,无法进行其他操作,给人一种程序崩溃或无响应的错觉。 ...
如果你的程序执行时间过长,可以考虑使用多线程,让主线程负责更新进度条,子线程处理计算任务。这需要使用MATLAB的并行计算工具箱。 5. **自定义进度条** 对于更复杂的需求,可以自定义进度条,使用`uicontrol`...
同时,使用JavaScript来更新进度条的样式,模拟进度的增加。 2. **后端部分**: - **JSP**:接收Ajax请求,处理登录验证逻辑。如果验证成功,返回一个标识;如果验证失败,可能返回错误信息。 - **Servlet/...
在这个示例中,我们创建了一个新的工作线程,该线程负责执行后台任务,并在完成时更新进度条。 首先,我们需要创建一个新的线程类,继承自`CWinThread`。在这个派生类中,重写`CWinThread::Run()`函数以实现后台...
1. 很多程序需要根据处理业务的进度来更新进度条,进度条的目的是让用户能知道业务处理的进度,有进度条的程序更友好,让用户知道程序在运行,而不是没有响应。 博文: ...
- 主线程中的Handler接收到Message后,通过重写`handleMessage()`方法,根据Message的内容更新进度条的值。 - 重复步骤2和3,直到耗时操作完成,进度条也相应地满格。 6. **注意事项**:由于Android的安全机制,...
Java中的`Thread`类或者`ExecutorService`允许我们并发执行多个任务,这样就可以同时上传多个文件,并在主线程中更新进度条。每个文件的上传任务可以作为一个单独的线程,线程间通过共享数据(如已上传文件数量、总...
- `draw()`: 更新进度条的宽度,模拟任务进度的变化。 ```javascript var currentProgress = 0; // 当前进度值 var time; // 计时器变量 function begin3() { document.getElementById("InstDesDiv").style....
为了更新进度条,我们需要在后台线程中执行任务,并通过委托将进度信息回调到主线程进行显示。这通常涉及到`Control.Invoke`或`Control.BeginInvoke`方法,它们用于在UI线程上安全地执行操作。 3. **线程安全...
3. **进度回调**:为了实时反映任务的进度,我们需要在后台任务中设置回调接口或者使用发布-订阅模式,每当进度有变化时,通知主线程更新进度条。例如,在Android的`AsyncTask`中可以重写`onProgressUpdate()`方法,...
// 更新进度条 try { Thread.sleep(50); // 延迟50毫秒,模拟耗时 } catch (InterruptedException e) { e.printStackTrace(); } } } }); } } ``` 这段源码的核心在于`OnClickListener`中的逻辑。当按钮被...
这个示例提供了一个解决方案,通过代理更新进度条,实现了启动过程的可视化。 首先,我们需要理解SplashScreen的作用。它是在应用程序启动时显示的一个临时窗口,通常展示公司标志、应用图标或者加载信息,给用户一...
许多开发者可能选择使用Timer控件来周期性地更新进度条,但这往往会导致进度条无法准确反映实际任务的进度。例如,当线程执行完毕时,进度条被一次性设置为100%,这并不能展示中间的过程。 2. **利用事件驱动机制*...
数据处理线程在完成一定量的工作后,会通过发送消息通知界面线程更新进度条。界面线程接收到消息后,会调用适当的函数,如`SetPos`来改变进度条的位置,以反映当前的处理进度。这样,即使数据处理在后台持续进行,...