Страницы

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

суббота, 8 февраля 2020 г.

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

#android #файлы


Всем привет, начал заниматься программированием под 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();
                }
                }

            });        
        }         
              }

Соответственно, в манифесте доступ в интернет открыт.  


    


Ответы

Ответ 1



//метод, который получает данные по ссылке 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();

Ответ 2



Нельзя в главном потоке лезть в тырнеты! Вот простейший пример с хорошим описанием как лезть в тырнеты в другом потоке.

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

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