InputStream не работает, если используется несколько раз - PullRequest
2 голосов
/ 07 сентября 2011

У меня проблемы с InputStream. Я пишу небольшое приложение для Android, и часть его должна получать HTML-код с веб-сайта. Обычно это работает нормально, но иногда (обычно во второй раз, когда он вызывается, но это может также потребовать несколько попыток воспроизвести это), он просто пропускает InputStream (я заметил это, поскольку при отладке это занимает несколько секунд, но каждый раз он потерпит неудачу, он просто сразу перейдет к следующей строке). Есть идеи, что может быть причиной и как это исправить?

    private class fetchdata extends AsyncTask<Void, Void, Void> {
            public Activity activity;      
            public fetchdata(Activity a)
            {
                activity = a;
            }  
            protected Void doInBackground(Void...voids)
            {
                String[] page = new String[16384]; //Number is just for testing, don't worry
                try {
                                page = executeHttpGet();
                        } catch (Exception e) {
                                page[0] = "Error";
                        }
                displayFetchedData(page);
                return null;
            }
    public String[] executeHttpGet() throws Exception {
         URL u;
        InputStream is = null;
        DataInputStream dis = null;
        String s;
        int i = 0;
        int hostselection;
        boolean skip;
        String[] page = new String[16384];
        String[] serverurls = new String[2];
        addSecurityException();
        SharedPreferences dataprefs = getSharedPreferences("serverdata", Context.MODE_PRIVATE);        
        hostselection = dataprefs.getInt("selectedhost", 0);
        SharedPreferences preferences;
        preferences = PreferenceManager.getDefaultSharedPreferences(activity);
        serverurls[0] = preferences.getString("server01", "");
        serverurls[1] = preferences.getString("server02", "");
        for (int j = 0; j < 2; j++)
        {
         skip = false;
         if (j == 0)
         {
                         if (hostselection == 0 || hostselection == 1)
                             {
                                 Authenticator.setDefault(new MyAuthenticator(activity, false));
                             }
                         else
                         {
                                 skip = true;
                         }
         }
         if (j == 1)
         {
                         if (hostselection == 0 || hostselection == 2)
                             {
                                 Authenticator.setDefault(new MyAuthenticator(activity, true));
                             }
                         else
                         {
                                 skip = true;
                         }
         }
         if (skip == false)
         {
                         try {
                            u = new URL(serverurls[j]);
                            is = u.openStream();        //LINE IN QUESTION
                            dis = new DataInputStream(new BufferedInputStream(is));
                            while ((s = dis.readLine()) != null)
                            {
                                if (s.length() > 18)
                                {
                                        page[i] = s;
                                        i++;
                                }
                            }
                         }
                         catch (IOException ioe)
                         {
                                 ioe.printStackTrace();
                         }
                         is.close();
                      }
        }
        return page;
   }

Ответы [ 2 ]

0 голосов
/ 07 сентября 2011

Не связано, но вы не закрываете DataInputStream.

Расскажите подробнее о пропуске. Возникает ли исключение? Возможно ли, что когда вы запускаете его вне режима отладки, он как-то ссылается на файлы устаревших классов? Единственное, что я могу себе представить, это то, что ваши отладочные и обычные классы как-то различаются.

0 голосов
/ 07 сентября 2011

Создайте BufferedInputStream из полученного входного потока, затем вызовите метод mark() с длиной входного потока в качестве параметра. Позвоните reset(), когда вам понадобится повторно использовать поток в следующий раз.

...