3

progress barSDカードのファイルを解凍して更新しようとして います。私の解凍は正常に機能しますが、表示されprogress barません。mainactivity の私のコードは次のとおりです。

private ProgressBar bar;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    bar = (ProgressBar) findViewById(R.id.progress);

    String zipFilename = Environment.getExternalStorageDirectory() + "path to my zip file in sd card";  
    String unzipLocation = Environment.getExternalStorageDirectory() + "the output folder";  




    Decompress d = new Decompress(zipFilename, unzipLocation);  
    d.unzip(); 
}

public class Decompress {   
    private String _zipFile;   
    private String _location;
    private int per = 0;



    public Decompress(String zipFile, String location) {
        _zipFile = zipFile;     
        _location = location;      
        _dirChecker("");   
        }    
    public void unzip() {     
        try  {       
            ZipFile zip = new ZipFile(_zipFile);
            bar.setMax(zip.size());
            FileInputStream fin = new FileInputStream(_zipFile);       
            ZipInputStream zin = new ZipInputStream(fin);
            ZipEntry ze = null;       
            while ((ze = zin.getNextEntry()) != null) {

                Log.v("Decompress", "Unzipping " + ze.getName());          
                if(ze.isDirectory()) {           
                    _dirChecker(ze.getName());         
                    } else {      
// Here I am doing the update of my progress bar

                        per++;
                        bar.setProgress(per);
                        FileOutputStream fout = new FileOutputStream(_location + ze.getName());           
                        for (int c = zin.read(); c != -1; c = zin.read()) {  

                            fout.write(c);           
                            }            
                        zin.closeEntry();          
                        fout.close();         
                        }                
                }       
            zin.close();    
            } catch(Exception e) {       
                Log.e("Decompress", "unzip", e);    
                }    
        }    
    private void _dirChecker(String dir) {     
        File f = new File(_location + dir);      
        if(!f.isDirectory()) {       
            f.mkdirs();     
            }   
        }

    }
}
4

3 に答える 3

9

解凍コードがメイン/UI スレッドで実行されているため、UI がフリーズしています。を使用してバックグラウンド スレッドで解凍を行いたいとしますAsyncTask

あなたのケースの例:

 private class Decompress extends AsyncTask<Void, Integer, Integer> {

   private String _zipFile;   
   private String _location;
   private int per = 0;

   public Decompress(String zipFile, String location) {
       _zipFile = zipFile;     
       _location = location;      
       _dirChecker("");   
   }


    @Override
    protected Integer doInBackground() {
        try {
            ZipFile zip = new ZipFile(_zipFile);
            bar.setMax(zip.size());
            FileInputStream fin = new FileInputStream(_zipFile);
            ZipInputStream zin = new ZipInputStream(fin);
            ZipEntry ze = null;
            while ((ze = zin.getNextEntry()) != null) {

                Log.v("Decompress", "Unzipping " + ze.getName());
                if (ze.isDirectory()) {
                    _dirChecker(ze.getName());
                } else {
                    // Here I am doing the update of my progress bar

                    per++;
                    publishProgress(per);

                    FileOutputStream fout = new FileOutputStream(_location + ze.getName());
                    for (int c = zin.read(); c != -1; c = zin.read()) {
                        fout.write(c);
                    }
                    zin.closeEntry();
                    fout.close();
                }
            }
            zin.close();
        } catch (Exception e) {
            Log.e("Decompress", "unzip", e);
        }
        return totalSize;
    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        bar.setProgress(per); //Since it's an inner class, Bar should be able to be called directly
    }

    @Override    
    protected void onPostExecute(Integer... result) {
        Log.i("Completed. Total size: " + result);
    }
}
于 2012-08-14T07:22:25.950 に答える
1

Android では、1 つの UI スレッドと、必要な数の他のバックグラウンド スレッドがあります。UI スレッドで一度に実行できるタスクは 1 つだけです。UI スレッドでファイルを解凍すると、進行状況ダイアログに関する操作など、他の操作がブロックされます。Android にはAsyncTaskが用意されており、UI スレッドに更新を投稿しながら、バックグラウンドで簡単に作業を行うことができます。

AsyncTask を使用して、onPreExecute()でダイアログを作成、セットアップ、表示し、ファイルを解凍して doInBackground() で進行状況を公開し、onProgressUpdate()で更新を表示し、onPostExecute()でダイアログを閉じます。

于 2012-08-14T07:37:32.113 に答える
0

AsyncTask は良い考えです。次のようになります。

private class RunningAlternativSearchAlways extends
        AsyncTask<Integer, Integer, Void> {


    final ProgressDialog dialog = new ProgressDialog(SearchResult.this) {
        @Override
        public boolean onSearchRequested() {
            return false;
        }
    };



    @Override
    protected void onPreExecute() {
        String DialogTitel = getString(R.string.daten_wait_titel);
        DialogText = getString(R.string.dialog_alternativalways_text);
        sucheNach = getString(R.string.dialog_suche_nach);
        dialog.setCancelable(true);
        dialog.setTitle(DialogTitel);
        dialog.setIcon(R.drawable.icon);
        dialog.setMessage(DialogText);
        dialog.setOnDismissListener(new OnDismissListener() {
            public void onDismiss(DialogInterface arg0) {
                // TODO Auto-generated method stub
                cancleBarcodeWorker();
            }
        });
        dialog.show();
    }

    public void cancleBarcodeWorker() {
        try {
            this.cancel(true);
        } catch (Exception ex) {

        }
    }

    @Override
    protected void onCancelled() {
        dialog.cancel();
        Toast toast = Toast.makeText(SearchResult.this, SearchResult.this
                .getString(R.string.toast_suche_abgebrochen),
                Toast.LENGTH_LONG);
        toast.show();
    }

    @Override
    protected Void doInBackground(Integer... param) {
        // UNZIP YOUR FILE HERE

        // PUBLISH YOUR PROGRESS LIKE THIS
        publishProgress(0, i);
        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        switch (values[0]) {
        case 0:
            // Suchbegriffe einzeln analysieren
            dialog.setMessage(DialogText + "\n" + sucheNach + " "
                    + suchBegriffe[values[1]]);
            break;
        }
    }

    @Override
    protected void onPostExecute(Void result) {
        // CLOSE YOUR DIALOG HERE
        dialog.cancle();
    }
}
于 2012-08-14T07:22:26.563 に答える