Salut à tous,
J'ai fait le code suivant pour récuperer un XML depuis un serveur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
public void getXMLData()
    {
        if (skipUpdate)
        {
            skipUpdate=false;
            return;
        }
        skipUpdate=true;
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        int SERVERPORT=0;
        try {
            SERVERPORT = Integer.parseInt(prefs.getString("pref_key_port_1","Port"));
        } catch (NumberFormatException e) {
            txtStatus.setText("Invalid Port Number");
            return;
        }
        String SERVERHOST = prefs.getString("pref_key_host_1","127.0.0.1");
        String PASSWORD = prefs.getString("pref_key_pass_1", "password");
        try {
            XMLFetcherTask myXMLFetcherTask = new XMLFetcherTask(SERVERHOST,SERVERPORT,PASSWORD);
            myXMLFetcherTask.execute();
        } catch (Exception e) {
            txtStatus.setText("Error "+e.getMessage());
            return;
        }
 
 
        skipUpdate=false;
    }
 
 
    public class XMLFetcherTask extends AsyncTask<Void, Void, Void> {
 
    String dstAddress;
    int dstPort;
    String response = "";
    String password="";
 
    XMLFetcherTask(String addr, int port, String pass){
        dstAddress = addr;
        dstPort = port;
        password=pass;
    }
 
    @Override
    protected Void doInBackground(Void... arg0) {
 
        Socket socket = null;
 
        try {
            socket = new Socket(dstAddress, dstPort);
 
 
            PrintWriter out = new PrintWriter(new BufferedWriter(
                    new OutputStreamWriter(socket.getOutputStream())),
                    true);
            out.println(password);
 
            response="";
            BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while (response.toLowerCase().indexOf("</response>")<0)
            {
                response+=input.readLine();
            }
 
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
           txtStatus.setText("UnknownHostException: " + e.getMessage());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            txtStatus.setText("IOException: " + e.getMessage());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            txtStatus.setText("Exception: " + e.getMessage());
        } finally{
                try {
                    socket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    //txtStatus.setText("Exception Finally: " + e.getMessage());
                }
            }
        return null;
    }
 
    @Override
    protected void onPostExecute(Void result) {
 
        if( !(response.substring(0,5).equalsIgnoreCase("<resp") || response.substring(0,5).equalsIgnoreCase("<?xml")) ) //!response.substring(0,5).equalsIgnoreCase("<?xml") ||
        {
            txtStatus.setText("Server response doesn't look XML, please check password: '"+response.substring(0,5)+"'");
        } else {
            lastXMLData=response;
            txtStatus.setText("Resp Len: " + response.length());
            skipUpdate=false;
            updateFragmentListeners();
        }
 
        super.onPostExecute(result);
    }
 
}
Et alors tout marche bien, sauf quand je catch UnknownHostException, a ce moment mon app plante avec le stack suivant:
07-29 15:52:08.754 1525-1538/android.process.acore V/BackupServiceBinder? doBackup() invoked
07-29 15:52:08.766 1525-1538/android.process.acore E/DictionaryBackupAgent? Couldn't read from the cursor
07-29 16:29:55.178 1525-1534/android.process.acore E/StrictMode? A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
java.lang.Throwable: Explicit termination method 'close' not called
at dalvik.system.CloseGuard.open(CloseGuard.java:184)
at android.os.ParcelFileDescriptor.<init>(ParcelFileDescriptor.java:180)
at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:916)
at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:906)
at android.app.IBackupAgent$Stub.onTransact(IBackupAgent.java:71)
at android.os.Binder.execTransact(Binder.java:446)
07-29 16:29:55.178 1525-1534/android.process.acore E/StrictMode? A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
java.lang.Throwable: Explicit termination method 'close' not called
at dalvik.system.CloseGuard.open(CloseGuard.java:184)
at android.os.ParcelFileDescriptor.<init>(ParcelFileDescriptor.java:180)
at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:916)
at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:906)
at android.app.IBackupAgent$Stub.onTransact(IBackupAgent.java:64)
at android.os.Binder.execTransact(Binder.java:446)
07-29 16:29:55.178 1525-1534/android.process.acore E/StrictMode? A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
java.lang.Throwable: Explicit termination method 'close' not called
at dalvik.system.CloseGuard.open(CloseGuard.java:184)
at android.os.ParcelFileDescriptor.<init>(ParcelFileDescriptor.java:180)
at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:916)
at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:906)
at android.app.IBackupAgent$Stub.onTransact(IBackupAgent.java:57)
at android.os.Binder.execTransact(Binder.java:446)
Je vois vraiment pas d'ou ça peut venir...
J'ai commenté les txtStatus.setText mais ça ne change rien...