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