-1

次のコードでは、強制終了エラーが発生します

  public class MainActivity extends Activity {

Button b1;
TextView tv;

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

    b1 = (Button) findViewById(R.id.button1);
    tv = (TextView) findViewById(R.id.textView1);

    b1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub


            new loadSomeStuff().execute();

        }
    });
}
  public class loadSomeStuff extends AsyncTask<String, Integer, String> {

    ProgressDialog dlg;

    protected void onPreExecute() {

        dlg = new ProgressDialog(MainActivity.this);

        dlg.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        dlg.setMessage("Loding Please Wait");
        dlg.setMax(100);
        dlg.show();
    }

    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub

        for (int i = 0; i < 20; i++) {
            try {
                Document document = new Document();
                PdfWriter.getInstance(document, new FileOutputStream(
                        Environment.getExternalStorageDirectory() + "/"
                                +  "/bg.pdf"));
                document.open();
                document.add(new Paragraph("hie"));
                Toast.makeText(getApplicationContext(), "Generated",
                        Toast.LENGTH_LONG).show();
                document.close();


            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (DocumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            publishProgress(5);

            try {
                Thread.sleep(88);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        dlg.dismiss();
        return null;
    }

    protected void onProgressUpdated(Integer... progress) {

        dlg.incrementProgressBy(progress[0]);
    }

    protected void onPostExecute(String result) {
        tv.setText("DONE");
    }
}
4

2 に答える 2

1

UI 以外のスレッドからダイアログを閉じようとしています。doInBackgroundメソッドはインターフェイスのものを呼び出さない可能性があります。dlg.dismiss();そこから を削除し、ui を変更できるonPostExecuteメソッドに配置します。

明確にするためにdoInBackground、名前が示すように、ユーザー インターフェイスを直接制御しないバックグラウンドスレッドであるため、ダイアログを閉じようとすると失敗します。

コーヒーが必要です。

于 2013-09-09T08:15:26.770 に答える
1

AsynTask では、doInBackGround() のみがバックグラウンド スレッドで動作します。

つまり、doInBackground() では なく、onPostExceute()、onPreExceute()、onProgressUpdated() などの他のメソッドで UI 要素にアクセスできます。

dlg.dismiss() を削除して完了

コードとコンセプトはこちら

于 2013-09-16T08:51:18.057 に答える