#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
Нельзя в главном потоке лезть в тырнеты! Вот простейший пример с хорошим описанием как лезть в тырнеты в другом потоке.
Комментариев нет:
Отправить комментарий