Android 如何实现此代码的进度对话框?
我的应用程序我要实现进度对话框,直到它得到加载。 代码如下:Android 如何实现此代码的进度对话框?,android,android-layout,android-emulator,android-widget,progressdialog,Android,Android Layout,Android Emulator,Android Widget,Progressdialog,我的应用程序我要实现进度对话框,直到它得到加载。 代码如下: copyFileFromAssetsToSDCard("Alone.mp4"); intent = new Intent(this,VideoPlayerController.class); startActivity(intent); 那么如何实施呢?? 谢谢 该函数的代码为: public void copyFileFromAssetsToSDCard(String fileFromAssets){ AssetManag
copyFileFromAssetsToSDCard("Alone.mp4");
intent = new Intent(this,VideoPlayerController.class);
startActivity(intent);
那么如何实施呢??
谢谢
该函数的代码为:
public void copyFileFromAssetsToSDCard(String fileFromAssets){
AssetManager is = this.getAssets();
InputStream fis;
try {
fis = is.open(fileFromAssets);
FileOutputStream fos;
fos = new FileOutputStream(new File(Environment.getExternalStorageDirectory(), fileFromAssets));
byte[] b = new byte[8];
int i;
while ((i = fis.read(b)) != -1) {
fos.write(b, 0, i);
}
fos.flush();
fos.close();
fis.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
尝试将复制代码移动到线程并显示对话框,在线程结束后,删除对话框并启动新活动 大概是这样的:
showDialog(10);//10 is the dialog id
new Thread(new Runnable(){
public void run(){
copyFileFromAssetsToSDCard("Alone.mp4");
handler.sendEmptyMessage(1);
}
}).start();
创建一个处理程序以接收消息:
Handler handler=new Handler(){
void handleMessage(Message msg){
switch(msg.what){
case 1:
removeDialog(10);
intent = new Intent(this,VideoPlayerController.class);
startActivity(intent);
break;
}
};
};
请尝试此代码以显示“进度”对话框
我认为您希望在后台线程中实现复制操作(在此期间,您希望显示进度条或对话框),复制操作完成后,您希望启动另一个活动,如果是这种情况,我建议您实现,我认为这是在Android中实现线程过程的最佳实践,因为如果我们已经实现了这个异步任务,开发人员就不需要关心线程管理 对于您的情况:
private class myBackgroundTask extends AsyncTask<Void, Void, Void>
{
@Override
protected void onPreExecute()
{
// Show Progress bar or dialog
}
protected Long doInBackground(Void... void) {
// write your Copy from Assets to SDcard code here
}
protected void onPostExecute(Long result)
{
if(dialog.isShowing()) // if progress dialog is showing
{
dialog.dismiss();
}
// And now Write Start Activity code here
}
}
私有类myBackgroundTask扩展了AsyncTask
{
@凌驾
受保护的void onPreExecute()
{
//显示进度条或对话框
}
受保护的长doInBackground(Void…Void){
//在此处将您的副本从资产写入SD卡代码
}
受保护的void onPostExecute(长结果)
{
if(dialog.isShowing())//如果正在显示进度对话框
{
dialog.dismise();
}
//现在在这里编写开始活动代码
}
}
更新:
仅供参考,快速更新AsyncTask称为,通读这篇文章,我相信您一定会了解与一般线程实现相比,这个概念的重要性。您可以这样做
创建一个arraylistfiles=new ArrayList()
并添加所有可以复制到SD卡的文件,如下所示
files.add("test.png");
files.add("icon.png");
new myAsyncTask().execute(files);
然后您可以使用这个ArrayList对象传递到AsynTask并完成它
private class myAsyncTask extends AsyncTask<ArrayList<String>, Void, Void>
{
ArrayList<String> files;
ProgressDialog dialog;
@Override
protected void onPreExecute() {
dialog = ProgressDialog.show(mainact.this, "Loading...", "");
}
@Override
protected Void doInBackground(ArrayList<String>... params) {
files = params[0];
for (int i = 0; i < files.size(); i++) {
copyFileFromAssetsToSDCard(files.get(i));
}
return null;
}
@Override
protected void onPostExecute(Void result) {
dialog.dismiss();
}
}
私有类myAsyncTask扩展了AsyncTask
{
ArrayList文件;
进程对话;
@凌驾
受保护的void onPreExecute(){
dialog=ProgressDialog.show(mainact.this,“正在加载…”);
}
@凌驾
受保护的Void doInBackground(ArrayList…params){
files=params[0];
对于(int i=0;i
公共类MainActivity扩展活动{
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
新建progressTask()。执行(“”);
}
public void copyFileFromAssetToSDCard(字符串文件FromAssets){
AssetManager is=this.getAssets();
输入流fis;
试一试{
fis=is.open(fileFromAssets);
文件输出流;
fos=新文件输出流(新文件(Environment.getExternalStorageDirectory(),fileFromAssets));
字节[]b=新字节[8];
int i;
而((i=fis.read(b))!=-1){
fos.写入(b,0,i);
}
fos.flush();
fos.close();
fis.close();
}捕获(IOE1异常){
e1.printStackTrace();
}
}
私有类progressTask扩展了AsyncTask{
ProgressDialog pd=新建ProgressDialog(MainActivity.this);
@凌驾
受保护的void onPreExecute(){
pd.show();
}
受保护的长doInBackground(字符串…参数){
从AssetToSDCard(单独的.mp4)复制文件;
}
受保护的void onPostExecute(void结果){
pd.解散();
}
}
}
我已经把你所有的任务安排在一起了。试试看。希望它能帮助您。您应该显示您试图将文件从资产复制到SD卡的代码。@Lalit:是的,您是对的。但是我只想把这个代码的进度对话框放在?澄清你的问题。请给出更多解释。@lalit:请查看更新后的问题。@iDroidExplorer您有解决方案吗?如果没有,请检查我的答案。为什么你有两个不同的进度对话??removeDialog和startDialog???showDialog(int id)和remove Dialog(int id)是活动中的两个方法,允许您访问使用活动类的onCreateDialog(int id)方法创建的对话框。Alternativley您可以保留您创建的一个对话框对象,类似于:ProgressDialog pd=ProgressDialog.show(上下文,“复制”,“请稍候”,true);并使用以下方法删除对话框:pd.remove();好的,谢谢你可爱的回答。我将把两个文件从资产复制到SD卡。但我想在onCreate活动中完成它。因此,如何使用AsyncTash???@iDroidExplorer,
new TaskName().execute()
将参数传递给构造函数或execute方法。您可以在execute方法内传递任何参数,如单个值、数组或arraylist,以及在doInBackground()内定义参数类型所需的参数方法。@IDrodExplorer在onCreate()
方法中编写新的myBackgroundTask().execute()
。我已经编写了此代码,但它给了我一个NUllPointer异常错误。是的,它可以按照我的要求工作。你真了不起。我总是接受你的回答,而且总是很好。谢谢。继续努力,继续帮助。欢迎,如果可能的话,我正在尽我最大的努力处理。你能帮我吗:如果这个代码帮助了你,请接受这个代码。谢谢
private class myAsyncTask extends AsyncTask<ArrayList<String>, Void, Void>
{
ArrayList<String> files;
ProgressDialog dialog;
@Override
protected void onPreExecute() {
dialog = ProgressDialog.show(mainact.this, "Loading...", "");
}
@Override
protected Void doInBackground(ArrayList<String>... params) {
files = params[0];
for (int i = 0; i < files.size(); i++) {
copyFileFromAssetsToSDCard(files.get(i));
}
return null;
}
@Override
protected void onPostExecute(Void result) {
dialog.dismiss();
}
}
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new progressTask().execute("");
}
public void copyFileFromAssetsToSDCard(String fileFromAssets){
AssetManager is = this.getAssets();
InputStream fis;
try {
fis = is.open(fileFromAssets);
FileOutputStream fos;
fos = new FileOutputStream(new File(Environment.getExternalStorageDirectory(), fileFromAssets));
byte[] b = new byte[8];
int i;
while ((i = fis.read(b)) != -1) {
fos.write(b, 0, i);
}
fos.flush();
fos.close();
fis.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
private class progressTask extends AsyncTask<String, Void, Void> {
ProgressDialog pd = new ProgressDialog(MainActivity.this);
@Override
protected void onPreExecute() {
pd.show();
}
protected Long doInBackground(String... params) {
copyFileFromAssetsToSDCard("Alone.mp4");
}
protected void onPostExecute(Void result) {
pd.dismiss();
}
}
}