1

我正在处理一个项目,在该项目中我正在解析来自 Internet 的 XML 文件并在 TextView 中显示其内容。

过程:当我单击按钮时,我将自己转发到从 Internet 获取 xml 的预测类,但现在我将 Async Progress 对话框添加到其中。编码没有错误,但是当我在其中运行应用程序时模拟器显示捕获异常消息“错误”它没有显示在添加异步进度对话框之前显示的“信息”。

public class Prediction extends Activity{

static final String baseUrl = "http://astroyogi.in/testandroid/Tarot/Tarot_Android.xml";
TextView tv1;
ImageView iv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.prediction);
    grabURL("http://astroyogi.in/testandroid/Tarot/Tarot_Android.xml");
    tv1 = (TextView) findViewById(R.id.tv1);
    }

public void grabURL(String url) {
    new GrabURL().execute(url);
}

private class GrabURL extends AsyncTask<String, Void, Void> {
    private ProgressDialog Dialog = new ProgressDialog(Prediction.this);
    static final String baseUrl = "http://astroyogi.in/testandroid/Tarot/Tarot_Android.xml";


    protected void onPreExecute() {
        Dialog.setMessage("Downloading source..");
        Dialog.show();
    }

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

        try{
            URL website = new URL(baseUrl);
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();
            Handlingpastxml doingWork = new Handlingpastxml();
            xr.setContentHandler(doingWork);  
            xr.parse(new InputSource(website.openStream()));
            String information = doingWork.getInformation();
            tv1.setText(information);
            }

        catch(Exception e){
            tv1.setText(e.getMessage());

        }
        return null;
    }


    protected void onPostExecute(Void unused) {
        Dialog.dismiss();
    }

}

}
4

6 回答 6

1

doinBackGround is non UI thread so never update your UI in this method

如果你想更新onProgressUpdate or onPostExecute method

在你的情况下,使用 onPostExecute 方法

String information=null;

@Override
protected void onCreate(Bundle savedInstanceState) {
     //your code block
 }

 in doinBackGround method in try block    

 information = doingWork.getInformation();<---Remove `String`

protected void onPostExecute(Void unused) {
        Dialog.dismiss();

        if(information!=null&&information.trim().length!=0)
        tv1.setText(information);
    }
于 2012-05-10T10:50:54.557 回答
1

仅供参考,您不能(直接)在 doInBackground() 方法中执行显示/更新 UI 类型的操作。

解决方案-1:

从 doInBackground() 中删除以下行并将其粘贴到onPostExecute()

 tv1.setText(information);

解决方案2:

如果您无论如何都想在 doInBackground() 中显示/更新 UI,请在以下内容中编写此类操作runOnUiThread()

 runOnUiThread(new Runnable() {
            
            public void run() {
                // TODO Auto-generated method stub
                tv1.setText(information);
            }
        });
于 2012-05-10T10:52:45.587 回答
0

这是一个线程问题:

当您在“doInBackground”方法中时,您不再在 UI 线程中。所以你不能说“tv1.setText(information);” 因为它不会更新您的 UI。

“doInBackground”适合您的繁重任务。当这些任务结束时,“onPostExecute”被调用。当您处于“onPostExecute”时,您处于 UI 线程中,您可以根据需要修改您的 UI。

于 2012-05-10T10:47:45.543 回答
0

new GrabURL().execute(url);不仅仅是写new GrabURL().execute();

因为您已经在 GrabURL 中创建了对象。

另一件事是,当您想在线程中更新 UI 时,我们使用处理程序,所以这里尝试保留 onPostExecute。

于 2012-05-10T10:49:58.553 回答
0

而不是下面的代码

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

        try{
            URL website = new URL(baseUrl);
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();
            Handlingpastxml doingWork = new Handlingpastxml();
            xr.setContentHandler(doingWork);  
            xr.parse(new InputSource(website.openStream()));
            String information = doingWork.getInformation();
            tv1.setText(information);
            }

        catch(Exception e){
            tv1.setText(e.getMessage());

        }
        return null;
    }


    protected void onPostExecute(Void unused) {
        Dialog.dismiss();
    }

尝试按照以下方式进行

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

        try{
            URL website = new URL(baseUrl);
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();
            Handlingpastxml doingWork = new Handlingpastxml();
            xr.setContentHandler(doingWork);  
            xr.parse(new InputSource(website.openStream()));
            String information = doingWork.getInformation();

            }

        catch(Exception e){
            String information = e.getMessage();

        }
        return information;
    }


    protected void onPostExecute(Void response) {
         tv1.setText(response);
        Dialog.dismiss();
    }
于 2012-05-10T10:52:05.853 回答
0

你不应该从非 UI 线程更新你的视图,在方法 doInbackground() 中你不能使用 tv1.setText(information);

删除

tv1.setText(information); 

从doInbackround()!并将其放入

protected void onPostExecute(Void unused) {
    Dialog.dismiss();
    tv1.setText(information);

}

信息也应该是一个全局变量

于 2012-05-10T10:54:57.010 回答