3

私の期待する結果は、最初の起動時に、バックグラウンドスレッドがコンテンツをロードするのを待つ進行状況ダイアログが表示されることです。ワーカースレッドがジョブを完了すると、ダイアログは閉じます。私は検索してこの解決策を手に入れましたAndroidでアクティビティを開始する前に進行状況ダイアログを表示するにはどうすればよいですか?

これは私の完全なコードです:

    private ManagerApplication app;
    private ImageAdapter adapter;
    private GridView gridview;

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

    private void setupView() {
        gridview = (GridView) findViewById(R.id.gridview);
        app = (ManagerApplication) getApplication();
        ProgressDialog progress = new ProgressDialog(this);
        progress.setMessage("Loading...");
        new LoadImageTask(progress, this).execute();       
    }

    private class LoadImageTask extends AsyncTask<Void, Void, Void> {
        private ProgressDialog progress;
        private Context context;

        public LoadImageTask(ProgressDialog progress, Context context) {
            this.progress = progress;
            this.context = context;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progress.show();
        }

        @Override
        protected Void doInBackground(Void... params) {
            adapter = new ImageAdapter(app.getShoes(), context);
            gridview.setAdapter(adapter); 
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            progress.dismiss();
        }

    }

ただし、「ビュー階層を作成した元のスレッドのみがビューにアクセスできる」という理由で、アプリケーションがクラッシュします。メインUIスレッドをブロックしているものがあると思いますが、それでも非常に不明です。それで、誰かが私に問題を指摘することができますか?ありがとう

4

2 に答える 2

5

おかしなことに、 Painless Threadingというタイトルの記事があります。でビューを操作しようとしないでくださいdoInBackground。あなたの場合、呼び出すことはできますapp.getShoes()が、そこでアダプターのセットアップを行わないでください。

于 2012-05-11T19:15:46.887 に答える
2

doinBackgroundは非UIスレッドであるため、このメソッドでUI(View)を更新しないでください...

と使用OnPostExecute or OnProgressUpdate for update UI

 @Override
        protected Void doInBackground(Void... params) {
           //here just background task ,
     //its non UI Thread so dont set ant view here set it in OnPostExecute,...
            return null;
        }

setupviewからasynctaskを呼び出します

private void setupView() {
        gridview = (GridView) findViewById(R.id.gridview);
        app = (ManagerApplication) getApplication();

        new LoadImageTask(progress, this).execute();       
  }

でProgressDilogを作成しますOnPreExecute method

ProgressDialog progress;

@Override
    protected void onPreExecute() {
        super.onPreExecute();

     progress = new ProgressDialog(this);
     progress.setMessage("Loading...");
     progress.show();
    }

とでonPostExecute dismiss it

于 2012-05-11T19:18:01.973 に答える