-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();并将其放在可以修改 uionPostExecute的方法上。

澄清一下,doInBackground顾名思义,它是一个无法直接控制用户界面的后台线程,这就是为什么当您尝试关闭对话框时,它会失败。

需要咖啡。

于 2013-09-09T08:15:26.770 回答
1

在 AsynTask 中,只有 doInBackGround() 在后台线程工作

这意味着您可以在其他方法中访问 UI 元素,例如 onPostExceute()、onPreExceute()、onProgressUpdated() 而不是 doInBackground()

删除 dlg.dismiss() 并完成

代码和概念在这里

于 2013-09-16T08:51:18.057 回答