0

アプリの初期化中にメッセージとプログレス バーを表示したいと考えています。

アプリを初めて実行するときに、いくつかの単語の辞書を SQLite データベースに挿入する必要があります。これを行うには、SQLiteOpenHelper を開いて再度閉じる AsyncTask を使用します。これにより、データベースの初期化が 1 回行われます。

private class AsyncDbInit extends AsyncTask<Void, Void, Void> {
    private Context context;
    private Intent intent;

    public AsyncDbInit(Context context, Intent intent){
        this.context = context;
        this.intent = intent;
    }

    @Override
    protected Void doInBackground(Void... params) {
        DatabaseHandler db = new DatabaseHandler(this.context);
        db.close();
        return null;
    }

    @Override
    protected void onPostExecute(Void param) {
        context.startActivity(this.intent);
    }

    @Override
    protected void onPreExecute() {}

    @Override
    protected void onProgressUpdate(Void... params) {}
}

この AsyncTask は私の onCreate() メソッドで呼び出されますが、onStart() と onResume() からも成功せずに実行しようとしました。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dispatcher);

    ... //some code finding the right intent

    new AsyncDbInit(this, nextIntent).execute();
}

どういうわけか、AsyncTask を呼び出すこの最後の行によって、UI が表示されなくなります。AsyncTask が完了して新しいアクティビティが開始されるまで、画面は空白のままです。その行をコメントアウトすると、UI が正常に表示されます。

私が思いつくことができる唯一のことは、SQLiteOpenHelper が何らかの形で UiThread をブロックすることですが、それについても何も見つかりませんでした。

4

2 に答える 2

0

AsyncTask にはいくつかのメソッドがあります。doInBackground() と同じように、バックグラウンドで実行したいことを行います。onPreExecute() と onPostExecute() という 2 つのメソッドもあります。ダイアログを作成して進行し、onPreExecute() メソッドでダイアログを表示し、onPostExecute() メソッドで閉じます。

于 2015-10-06T15:51:14.710 に答える
0

スレッド プール エグゼキューターで AsynTask.executeOnExecutor() を使用してみてください。これが機能する場合は、UI の読み込みに関連する何かが AsyncTask も使用していることを意味します。デフォルトでは、AsyncTask は単一のワーク スレッドで順次実行されるため、競合が発生する可能性があります。このシリアル実行は、多くの場合、必要なものですが、常にではありません。

UI でライブラリを使用して文字列やその他のコンテンツを読み込みますか? レイアウト XML を提供できますか?

于 2015-10-06T16:40:55.760 に答える