0

私は新しい Android プログラマーです。これが解決できないという私の質問です。

MainActivity、Database、および ProgressShow の 3 つのクラスがあります。

クラス Database には、assets に大きなデータベースをコピーする機能があります。ProgressShow では、ProgressDialog を構築するために使用されます。

しかし、プログラムを起動すると、ダイアログは表示されませんでしたが、約数秒後にハンドラーのブレークで停止しました。大きなファイルをコピーするときにメッセージ キューが動かなくなったようです。しかし、理由はわかりません。これが私のプログラムです。助けてください。ありがとう。

public class MainActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);         

        Database database = new Database(this);
        database.CopyBigDatabase(CommonPara.DB_CONTENT_NAME, 
                    CommonPara.DB_CONTENT_PATH + CommonPara.DB_CONTENT_NAME, 
                    CommonPara.DB_CONTENT_COUNT);
    }
}   



public class Database
{
    private Context mContext;

    public Database(Context context)
    {
        mContext = context;
    }

    public SQLiteDatabase DbConnection(String file)
    {
        SQLiteDatabase db = null;

        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) 
        {
            db = SQLiteDatabase.openOrCreateDatabase(file, null);
        }
        else
        {

        }       
        return db;
    }

    public void CopyBigDatabase(final String name, final String dest, final int count)
    { 
        new Thread() 
        {
            public void run() 
            {   
                final ProgressShow dialog = new ProgressShow(
                    mContext, "please wait", "wait", ProgressShow.DIALOG_TYPE_BAR,
                    ProgressShow.DIALOG_DEFAULT_MAX);
                dialog.ShowDialog();

                try 
                {   
                    InputStream is;
                    OutputStream os = new FileOutputStream(dest);

                    for (int i = 1; i <= count; i++)
                    {
                        is = mContext.getAssets().open(name + "." + 
                            String.format("%03d", i));
                        byte[] buffer = new byte[1024];
                        int length;
                        while ((length = is.read(buffer)) > 0) 
                        {
                            os.write(buffer, 0, length);
                        }

                        os.flush();
                        is.close();

                        if(dialog.GetProgress()
                            < ProgressShow.DIALOG_DEFAULT_MAX -1) 
                        {
                            dialog.CloseDialog();
                        }
                    }
                    os.close();
                } 
                catch (Exception e) 
                {

                }
                finally
                {
                    dialog.CloseDialog();
                }
            }
        }.run();            
    }
}



public class ProgressShow
{
    private ProgressDialog dialog = null; 

    public static final int DIALOG_TYPE_SPINNER = 0;    
    public static final int DIALOG_TYPE_BAR = 1;    
    public static final int DIALOG_DEFAULT_MAX = 100;
    public static final int DIALOG_DEFAULT_INCREASE = 1;

    @SuppressLint("HandlerLeak")
    Handler handler = new Handler() 
    {
        @Override
        public void handleMessage(Message msg) 
        {                
            if(msg.what == 0)
            {                
                dialog.show();                
            }
            else
            {
                dialog.incrementProgressBy(msg.what);
                if(GetProgress() >= GetMax()) 
                {
                    dialog.cancel();
                } 
            }

            super.handleMessage(msg);
        }
    };    


    public ProgressShow(Context context, String title, 
                        String message, int type, int max) 
    {  
        dialog = new ProgressDialog(context);

        switch (type) 
        {
            case 0:
                dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);                
                break;

            case 1:
            default:
                dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                break;
        }

        dialog.setMax(max);        
        dialog.setTitle(title);  
        dialog.setMessage(message);
        dialog.setIndeterminate(false);
        dialog.setCancelable(false);
        dialog.setCanceledOnTouchOutside(false);
        dialog.setProgress(-dialog.getProgress());

    }    

    public void ShowDialog() 
    {   
        handler.sendEmptyMessage(0);        
    }  

    public void AddProgress(int increase)
    {
        handler.sendEmptyMessage(increase);
        int a = GetProgress();
    }

    public int GetProgress()
    {
        return dialog.getProgress();
    }    

    public void CloseDialog()
    {
        handler.sendEmptyMessage(GetMax());    
    }

    public int GetMax()
    {
        return dialog.getMax();
    }

}
4

1 に答える 1

0

ProgressDialog はメイン スレッドで表示する必要があります。ハンドラーが作成されたスレッドで実行されているためです)。

フローは次のとおりです。新しいスレッドを作成し、このスレッドで新しい ProgressShow を作成します。新しい ProgressShow オブジェクトを作成するときは、新しい Handler オブジェクトを作成します。このハンドラーは、新しいスレッドで作成されます。メイン以外のスレッドから進行状況ダイアログを表示することはできません。

于 2013-06-25T13:10:18.610 に答える