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