2013-09-03 6 views
0

Я хочу прочитать удаленный текстовый файл и показать его содержимое в текстовом виде. Я написал этот код, но он не получает никакой информации из текстового файла и имеет ошибку «force stop». Как я могу найти причину этой проблемы или решить ее? В моем коде нет ничего плохого?как читать текстовый файл из Интернета в Android

private class DownloadFile extends AsyncTask<String, Integer, Void> { 
protected void doInBackground() { 
    try { 
     URL url = new URL("http://host/f.txt");  
     BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 
     String line = null; 
     while ((line = in.readLine()) != null) { 
     //get lines 
     } 
     in.close(); 
     lbl.setText(line); 
    } 
    catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
protected void onProgressUpdate() { 
    //called when the background task makes any progress 
} 
protected void onPreExecute() { 
    //called before doInBackground() is started 
} 
protected void onPostExecute() { 
    //called after doInBackground() has finished 
} 
@Override 
protected Void doInBackground(String... arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 
} 

и мой OnCreate код:

DownloadFile d=new DownloadFile(); 
d.doInBackground(); 

пожалуйста решить мою проблему!

ответ

0

Пара вещей:

1) Вы не можете изменить поток пользовательского интерфейса от фонового потока. doInBackground() работает на фоне темы, вы должны обновить свой интерфейс пользователя по адресу onPostExecute().

2) У вас есть две реализации doInBackground(). Первый не отменяет doInBackground() в AsyncTask. Переместите этот код на тот, который переопределяет AsyncTask

3) doInBackground() должен вернуть строку, чтобы вы могли ее использовать для обновления текста в TextView в onPostExecute. AsyncTask должен выглядеть следующим образом AsyncTask<String,Void,String>

4) При создании экземпляра DonwloadFile() вы должны ссылаться на его выполнение(), в противном случае фон резьба не заводится и doInBackground() не будет вызвана.

5) Ваш цикл while проверяет, есть ли еще данные в InputStream, но он не хранит его нигде. Используйте StringBuilder для добавления входящей информации, например here.

0

людям легче помочь вам, если вы отправляете трассировку стека исключений из Logcat.

Если вы используете Eclipse, и не знаю, что я говорю, посмотрите here

0

Вы можете использовать droidQuery библиотеку, чтобы справиться с этим, а также, чтобы поймать любые ошибки, вы можете иметь:

$.ajax(new AjaxOptions().context(this).url("http://example.com/f.txt").dataType("text").success(new Function() { 
    @Override 
    public void invoke($ d, Object... params) { 
     String fileContents = (String) params[0]; 
     Log.i("File contents", fileContents; 
    } 
}).error(new Function() { 
    @Override 
    public void invoke($ d, Object... params) { 
     AjaxError error = (AjaxError) params[0]; 
     Log.e("Ajax", "Error " + error.status + ": " + error.reason); 
    } 
})); 

Также не забудьте проверить свой файл AndroidManifest.xml. Вы запрашиваете у INTERNETиспользование-разрешение?

Смежные вопросы