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();
       }

   }

}