Страницы

Поиск по вопросам

воскресенье, 14 апреля 2019 г.

Получение контента из удалённого файла и вывод его в Toast

Всем привет, начал заниматься программированием под Android совсем недавно. Вот который день мучаюсь с простейшим кодом. Даже решил попросить увас помощи, ибо сам не в силах осмыслить. Данная программа должна считывать содержание файла в интернете и выводить его в Toast (всплывающее сообщение). Например, в удалённом файле написано "Hello world!" и это сообщение выводится в тоаст при нажатии на кнопку. Перепробывал все возможные варианты кодов. При нажатии на кнопку либо ничего не происходит, либо приложение вылетает. Помогите, очень нужно! Желательно расписать всё подробно, чтобы я смог разобраться =) Вот полный код main_activity package com.example.byfile;
import android.os.Bundle; import com.example.byfile.R; import android.app.Activity;
import android.os.Bundle;
import android.view.View; import android.widget.Button; import android.widget.Toast;
import java.net.URL; import java.io.*;
public class MainActivity extends Activity {
Button btnSend;
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
btnSend = (Button) findViewById(R.id.btnSend);
btnSend.setOnClickListener(new View.OnClickListener() { public void onClick(View v) {
try { URL myURL = new URL("http://my-site.ru/file.txt"); InputStream dataStream = myURL.openConnection().getInputStream(); InputStreamReader isr = new InputStreamReader(dataStream, "UTF-8"); StringBuffer data = new StringBuffer(); int c; while ((c = isr.read()) != -1){ data.append((char) c); }
String phoneNumber = new String (data.toString());
Toast toast = Toast.makeText(getApplicationContext(), phoneNumber, Toast.LENGTH_SHORT); toast.show(); } catch (IOException ie) { ie.printStackTrace(); } }
}); } } Соответственно, в манифесте доступ в интернет открыт.


Ответ

//метод, который получает данные по ссылке public static String executeHttpGet(String uri) throws Exception {
String result = ""; try {
URL url = new URL(uri); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); String str; while ((str = in.readLine()) != null) { result +=str; } in.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return result; }
//читать данные лучше в фоновом потоке, а по завершению выводить сообщение private class ReadInBackground extends AsyncTask { String url = ""; public ReadInBackground(String ur) { url = ur; }
@Override protected String doInBackground(Void... voids) {
//тут все выполняется в фоновом потоке return executeHttpGet(url); }
@Override protected void onPostExecute(String params) { //тут выполняется после завершения фонового потока в основном //так же тут можно делать операции с интерфейсом, если нужно Teoast.makeText(getApplicationContext(), params,Toast.LENGTH_SHORT).show(); } }
//что бы запустить фоновый поток, которые описан выше //нужно сделать следующее new ReadInBackground("ваша ссылка").execute(); UPD: new ReadInBackground("ваша ссылка").execute(); это как вызвать какой нибудь метод. Тут создается экземпляр класса ReadInBackground и сразу же вызывается метод execute, который и запускает фоновый поток. ReadInBackground наследуется от AsyncTask, а соответственно в ReadInBackground доступные все не приватные методы, которым execute и является. Советую почитать примеры от Google. Если вызов new ReadInBackground("ваша ссылка").execute(); сложен, то можно по другому сделать: //создание объекта и вызов его метода //а это можете вставлять куда вам нужно будет ReadInBackground read = new ReadInBackground("ваша ссылка"); read.execute();

Комментариев нет:

Отправить комментарий