Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2013, 21:12   #1
Rammsteinik
Пользователь
 
Регистрация: 29.03.2012
Сообщений: 13
По умолчанию Получение контента из удалённого файла и вывод его в Toast

Всем привет, начал заниматься программированием под Android совсем недавно. Вот который день мучаюсь с простейшим кодом. Даже решил попросить увас помощи, ибо сам не в силах осмыслить. Данная программа должна считывать содержание файла в интернете и выводить его в Toast (всплывающее сообщение). Например, в удалённом файле написано "Hello world!" и это сообщение выводится в тоаст при нажатии на кнопку. Перепробывал все возможные варианты кодов. При нажатии на кнопку либо ничего не происходит, либо приложение вылетает. Помогите, очень нужно! Желательно расписать всё подробно, чтобы я смог разобраться =)

Вот полный код main_activity

PHP код:
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 = (ButtonfindViewById(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 ((
isr.read()) != -1){
                               
data.append((charc);
                        }

                        
String phoneNumber = new String (data.toString());

                        
Toast toast Toast.makeText(getApplicationContext(), 
                                
phoneNumberToast.LENGTH_SHORT); 
                                
toast.show();
                } 
                catch (
IOException ie) {
                      
ie.printStackTrace();
                }
                }
                        
               
               
            });        
        }         
                } 
Соответственно, в манифесте доступ в интернет открыт.

PHP код:
<uses-permission android:name="android.permission.INTERNET"/> 
Rammsteinik вне форума Ответить с цитированием
Старый 20.02.2013, 04:05   #2
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

1. Нехорошо читать посимвольно с небуферизованного потока.
2. Поток нужно закрывать в finally
3. Поскольку коннект на удаленный ресурс - это медленная операция, её надо выполнять в отдельном потоке:
Код:
@Override
    public void onCreate(final Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.main);

        final Button btnSend = (Button)this.findViewById(R.id.btnSend);
        btnSend.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(final View v)
            {
                new Thread(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        try
                        {
                            final URL myURL = new URL("http://www.youtube.com/robots.txt");
                            final URLConnection connection = myURL.openConnection();
                            connection.setDoInput(true);
                            final Reader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charset.forName("UTF-8")));

                            try
                            {
                                final char [] buffer = new char[1024];
                                final StringBuilder message = new StringBuilder();

                                int readCount;
                                do
                                {
                                    readCount = reader.read(buffer);
                                    message.append(buffer);
                                }
                                while (readCount >= buffer.length);


                                MyActivity.this.runOnUiThread(new Runnable()
                                {
                                    @Override
                                    public void run()
                                    {
                                        Toast.makeText(MyActivity.this.getApplicationContext(), message.toString(), Toast.LENGTH_LONG).show();
                                    }
                                });

                            }
                            catch (final IOException ex)
                            {
                                Log.d("IOException", ex.getMessage());
                            }
                            finally
                            {
                                reader.close();
                            }
                        }
                        catch (final Exception ex)
                        {
                            Log.d("Some exception", ex.getMessage());
                        }
                    }
                }).start();

            }
        });
Carbon вне форума Ответить с цитированием
Старый 20.02.2013, 08:58   #3
Rammsteinik
Пользователь
 
Регистрация: 29.03.2012
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Carbon Посмотреть сообщение
1. Нехорошо читать посимвольно с небуферизованного потока.
2. Поток нужно закрывать в finally
3. Поскольку коннект на удаленный ресурс - это медленная операция, её надо выполнять в отдельном потоке:...

спасибо. а как вывести контент из 2х файлов в 1 тоаст? вот попробывал написать но он выводит контент только из последнего файла


PHP код:
package com.example.byfile;

import android.os.Bundle;
import com.example.byfile.R;
import android.app.Activity;

import android.os.Bundle;

import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.net.*;
import java.io.*;
import java.nio.charset.Charset;

public class 
MainActivity extends Activity {

     
Button btnSend;

        @
Override
        
public void onCreate(final Bundle savedInstanceState)
        {
            
super.onCreate(savedInstanceState);
            
this.setContentView(R.layout.activity_main);

            final 
Button btnSend = (Button)this.findViewById(R.id.btnSend);
            
btnSend.setOnClickListener(new View.OnClickListener()
            {
                public 
void onClick(final View v)
                {
                    new 
Thread(new Runnable()
                    {
                        @
Override
                        
public void run()
                        {
                            try
                            {
                                 final 
URL myURL = new URL("http://мой-сайт/1.txt");
                                    final 
URLConnection connection myURL.openConnection();
                                    
connection.setDoInput(true);
                                    final 
Reader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charset.forName("UTF-8")));

                                    final 
URL myURL2 = new URL("http://мой-сайт/2.txt");
                                    final 
URLConnection connection2 myURL2.openConnection();
                                    
connection2.setDoInput(true);
                                    final 
Reader reader2 = new BufferedReader(new InputStreamReader(connection2.getInputStream(), Charset.forName("UTF-8")));
                                try
                                {
                                    
//буфер 1   
                                    
final char [] buffer1 = new char[1024];
                                    final 
StringBuilder message = new StringBuilder();

                                    
int readCount;
                                    do
                                    {
                                        
readCount reader.read(buffer1);
                                        
message.append(buffer1);
                                    }
                                    while (
readCount >= buffer1.length);

                                    
//буфер 2
                                    
final char [] buffer2 = new char[1024];
                                    final 
StringBuilder message2 = new StringBuilder();

                                    
int readCount2;
                                    do
                                    {
                                        
readCount2 reader2.read(buffer2);
                                        
message2.append(buffer2);
                                    }
                                    while (
readCount2 >= buffer2.length);

                                    
MainActivity.this.runOnUiThread(new Runnable()
                                    {
                                        @
Override
                                        
public void run()
                                        {

                                            
Toast.makeText(MainActivity.this.getApplicationContext(), message message2.toString(), Toast.LENGTH_LONG).show();
                                        }
                                    });

                                }
                                catch (final 
IOException ex)
                                {
                                    
Log.d("IOException"ex.getMessage());
                                }
                                finally
                                {
                                    
reader.close();
                                }
                            }
                            catch (final 
Exception ex)
                            {
                                
Log.d("Some exception"ex.getMessage());
                            }
                        }
                    }).
start();

                }
            });

}} 
Rammsteinik вне форума Ответить с цитированием
Старый 20.02.2013, 10:35   #4
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Не создавать buffer2 и message2
Carbon вне форума Ответить с цитированием
Старый 20.02.2013, 14:45   #5
Rammsteinik
Пользователь
 
Регистрация: 29.03.2012
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Carbon Посмотреть сообщение
Не создавать buffer2 и message2
а как тогда реализовать, не создавая их?
Rammsteinik вне форума Ответить с цитированием
Старый 20.02.2013, 17:08   #6
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

А вот так!
Код:
do 
{ 
     readCount = reader2.read(buffer); 
     message.append(buffer, 0, readCount); 
} 
while (readCount >= buffer.length);
Да, кстати, в предыдущем цикле такой же append
Carbon вне форума Ответить с цитированием
Старый 20.02.2013, 18:44   #7
Rammsteinik
Пользователь
 
Регистрация: 29.03.2012
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Carbon Посмотреть сообщение
А вот так!
Код:
do 
{ 
     readCount = reader2.read(buffer); 
     message.append(buffer, 0, readCount); 
} 
while (readCount >= buffer.length);
Да, кстати, в предыдущем цикле такой же append
всё равно не понял, как из 2х файлов вывести содержание в тоаст не создавая 2го буфера и мессадж. сделал как вы сказали, при нажатии на кнопку вылазит тоаст с "java.io.BuferedReader@44193e1java. io.BuferedReader@55646y67". это наверное потому что я написал
Код:
Toast.makeText(MainActivity.this.getApplicationContext(), reader2.toString() + reader.toString(), Toast.LENGTH_LONG).show();
просто нет второго message как было раньше и я не знаю как выводить в тоаст 2 содержания. можете привести подробный код активити?

Последний раз редактировалось Rammsteinik; 20.02.2013 в 19:05.
Rammsteinik вне форума Ответить с цитированием
Старый 20.02.2013, 20:27   #8
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Я имел в виду в мой код дописать ещё одно чтение. Ну и хрен с ним. Вот вариант получше:
Код:
package com.example.TestAndroid;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset;

public class MyActivity extends Activity
{
    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(final Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.main);

        final Button btnSend = (Button)this.findViewById(R.id.btnSend);
        btnSend.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(final View v)
            {
                new Thread(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        try
                        {
                            final Writer stringWriter = new CharArrayWriter();

                            MyActivity.readDataFromURL(new URL("http://www.youtube.com/robots.txt"), stringWriter);
                            MyActivity.readDataFromURL(new URL("http://rutracker.org/robots.txt"), stringWriter);

                            MyActivity.this.runOnUiThread(new Runnable()
                            {
                                @Override
                                public void run()
                                {
                                    Toast.makeText(MyActivity.this.getApplicationContext(), stringWriter.toString(), Toast.LENGTH_LONG).show();
                                }
                            });
                        }
                        catch (final Exception ex)
                        {
                            final PrintWriter errMsgWriter = new PrintWriter(new CharArrayWriter());
                            ex.printStackTrace(errMsgWriter);

                            Log.d(ex.getClass().toString(), errMsgWriter.toString());
                        }
                    }
                }).start();

            }
        });
    }


    static private void readDataFromURL(final URL url, final Writer writer) throws IOException
    {
        final URLConnection connection = url.openConnection();
        connection.setDoInput(true);

        final Reader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charset.forName("UTF-8")));

        try
        {
            MyActivity.copyReaderToWriter(reader, writer);
        }
        finally
        {
            reader.close();
        }
    }

    static private void copyReaderToWriter(final Reader reader, final Writer writer) throws IOException
    {
        final char [] buffer = new char[1024];

        int readCount;
        do
        {
            readCount = reader.read(buffer);
            if (readCount > 0) writer.write(buffer, 0, readCount);
        }
        while (readCount >= 0);
    }
}
Carbon вне форума Ответить с цитированием
Старый 21.02.2013, 09:13   #9
Rammsteinik
Пользователь
 
Регистрация: 29.03.2012
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Carbon Посмотреть сообщение
Я имел в виду в мой код дописать ещё одно чтение. Ну и хрен с ним. Вот вариант получше...
спасибо, работает. но здесь контенты сливаются, а я хотел поставить пробел между 2мя контентами из файлов. как это реализовать?
Rammsteinik вне форума Ответить с цитированием
Старый 21.02.2013, 12:00   #10
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Ну между вызовами добавь вставку пробела.
Carbon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод текста командного файла при его выполнении в текстовой файл DOS\bat IOperKOTI Помощь студентам 5 20.12.2012 18:22
Вывод контента в несколько колонок.не работает timedo PHP 2 02.11.2012 14:51
загрузка в Timage удалённого файла Vervolf Общие вопросы Delphi 5 10.12.2011 11:47
Загрузка в RichEdit текста из файла, и получение его из RichEdit Byurrer Общие вопросы C/C++ 1 09.04.2011 10:17
Закачка и сохранение файла с удалённого сервера sKarl PHP 2 19.10.2008 11:51