关于android:如何使用AsyncTask和PublishProgress获取XML

How to get XML using AsyncTask and PublishProgress

我解析 XML 数据并将其放入一个对象中。这需要相当长的时间,我决定使用 AsyncTask 在后台运行它。我的代码几乎和这个例子一模一样:
如何使用 AsyncTask 和 Timer 获取 XML?

不同之处在于我想在我走多远的时候发布Progress。我要发布进度的代码的相关部分:

1
2
3
4
5
6
7
8
9
@Override  
public void endElement(String namespaceURI, String localName, String qName) throws SAXException {      
        if (localName.equalsIgnoreCase("client")) {        
            clients.addClient(mClient);
            // Publish Progress
            RotationAwareTask.publishProgress();
            mClient = null;
        }      
    }

到现在为止,您已经推断出我是新手。与我想做的最接近的研究表明:

http://www.mail-archive.com/[email protected]/msg79275.html

Yes, that is a bit more complex... Two
approaches:

1) Make AsyncTask implement
org.sax.ContentHandler. That way the
SAX callbacks have direct access to
AsyncTask.publishProgress().

2) Create a delegate so that the
parser has a handle back to AsyncTask
for posting progress updates.

当我尝试上述方法时,我得到:

The method
publishProgress(Progress...) from the
type AsyncTask is
not visible

唉,我怎样才能从 endElement 调用 publicProgress?或者有人可以给我一些如何正确地做到这一点?回顾一下:

我有 XML 数据。
读取数据是一个漫长的操作。
我使用 SAXParser 来获取数据。
在 endElement 方法中,数据被添加到最终将在其他地方使用的对象中。
大多数研究表明我必须使用 AsyncTask 并且我现在正在使用它,因为我有一个来自 Commonsware 的很好的屏幕旋转示例。
问题是我如何更新进度。

编辑:
@Cristian 这里是异步任务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
static class RotationAwareTask extends AsyncTask<Void, Void, Void> {        
        RotationAsync activity = null;      
        int progress = 0;      

        private SaxClientsHandler saxClientsHandler;

        RotationAwareTask(RotationAsync activity) {
            attach(activity);
        }

            @Override
        protected Void doInBackground(Void... unused) {        
            try {
                SAXParserFactory spf = SAXParserFactory.newInstance();
                SAXParser sp = spf.newSAXParser();
                XMLReader xr = sp.getXMLReader();
                saxClientsHandler = new SaxClientsHandler();
                xr.setContentHandler(saxClientsHandler);
                InputSource mSource = new InputSource( new StringReader( Whmcs.getClientsXml() ) );
                xr.parse(mSource);          
            } catch (Exception e) {
                Log.e(TAG, e.getMessage(), e);
            }          
            return(null);      
        }

        @Override
        protected void onProgressUpdate(Void... unused) {
            if (activity==null) {
                Log.w("RotationAsync","onProgressUpdate() skipped – no activity");
            }
            else {
                progress += 5;
                activity.updateProgress(progress);
            }
        }

        @Override
        protected void onPostExecute(Void unused) {
            if (activity == null) {
                Log.w("RotationAsync","onPostExecute() skipped – no activity");
            }
            else {
                activity.markAsDone();
            }
        }

        void detach() {
            activity = null;
        }

        void attach(RotationAsync activity) {
            this.activity = activity;
        }

        int getProgress() {        
            return(progress);
        }

    }

这几乎是这个 Commonsware 示例的完全相同的副本:
https://github.com/commonsguy/cw-android/blob/master/Rotation/RotationAsync/src/com/commonsware/android/rotation/async/RotationAsync.java

如你所见:

saxClientsHandler = new
SaxClientsHandler();

调用存在 endElement 方法的 SaxClientHandler()。我正在尝试从那里发布进度。

@Mayra,您是否建议我将所有 saxClientHandler 代码迁移到 AsyncTask 中?


你在做 RotationAwareTask.publishProgress(); publishProgress 不是静态方法,你需要在 RotationAwareTask 的实例上调用它。