2016-07-04 2 views
0

Я новичок в android и не знаю много. Мне нужна помощь в изменении этого кода - я хочу загрузить некоторый текст с веб-сайта.Как загрузить текст из Интернета в android?

Если я использую код: новый DownloadTextTask(). Execute ("http://www.test.com/file.xml");

Он не показывает загруженный текст в TextView, но если я снова открою приложение, я смогу увидеть текст. Я думаю, это потому, что он асинхронный, и у него есть задержка для загрузки текста.

Как я могу это исправить, или просто использовать этот код вместо этого: (я имею в виду, используя DownloadText() функцию непосредственно Он не работал, когда я пытался!)

TextView txt = (TextView)findViewById(R.id.textTest);   
txt.setText(DownloadText("http://www.test.com/")); 

Весь код:

public class MainActivity extends AppCompatActivity { 
    public InputStream OpenHttpConnection(String urlString) throws IOException{ 
     InputStream in = null; 
     int response = -1; 
     URL url = new URL(urlString); 
     URLConnection conn = url.openConnection(); 
     if (!(conn instanceof HttpURLConnection)) 
      throw new IOException("Not an HTTP connection"); 
     try{ 
      HttpURLConnection httpConn = (HttpURLConnection) conn; 
      httpConn.setAllowUserInteraction(false); 
      httpConn.setInstanceFollowRedirects(true); 
      httpConn.setRequestMethod("GET"); 
      httpConn.connect(); 
      response = httpConn.getResponseCode(); 
      if (response == HttpURLConnection.HTTP_OK) { 
       in = httpConn.getInputStream(); 
      } 
     } 
     catch (Exception ex) 
     { 
      Log.d("MainActivity", ex.getLocalizedMessage()); 
      throw new IOException("Error connecting"); 
     } 
     return in; 
    } 

    public String DownloadText(String URL) 
    { 
     int BUFFER_SIZE = 2000; 
     InputStream in = null; 
     try { 
      in = OpenHttpConnection(URL); 
     } catch (IOException e) { 
      Log.d("MainActivity", e.getLocalizedMessage()); 
      return ""; 
     } 
     InputStreamReader isr = new InputStreamReader(in); 
     int charRead; 
     String str = ""; 
     char[] inputBuffer = new char[BUFFER_SIZE]; 
     try { 
      while ((charRead = isr.read(inputBuffer))>0) { 
//---convert the chars to a String--- 
       String readString = 
       String.copyValueOf(inputBuffer, 0, charRead); 
       str += readString; 
       inputBuffer = new char[BUFFER_SIZE]; 
      } 
      in.close(); 
     } catch (IOException e) { 
      Log.d("MainActivity", e.getLocalizedMessage()); 
      return ""; 
     } 
     return str; 
    } 

    private class DownloadTextTask extends AsyncTask<String, Void, String> { 

     protected String doInBackground(String... urls) { 
      return DownloadText(urls[0]); 
     } 
     @Override 
     protected void onPostExecute(String result) { 
      Toast.makeText(getBaseContext(), result, Toast.LENGTH_LONG).show(); 

     } 

    } 

    public static class xmlClass 
    { 
     public static String xml =""; 
    } 



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

//new DownloadTextTask().execute("http://www.test.com/file.xml"); 

     TextView txt = (TextView)findViewById(R.id.textTest); 
     txt.setText(DownloadText("http://www.test.com/file.xml")); 

    } 
} 
+0

Почему вы не используете веб-просмотр для этого? –

+0

использовать txt.setText (result) в методе onPostExecute – Muthu

+0

@Muthu Мне нужно сохранить его в строковой переменной для его синтаксического анализа. – Saeid

ответ

2

сделать обратный вызов от AsyncTask следующего

private class DownloadTextTask extends AsyncTask { 
MainActivity instance=null; 
    public DownloadTextTask(MainActivity instance){ 
     this.instance=instance; 
    } 


    protected String doInBackground(String... urls) { 
     return DownloadText(urls[0]); 
    } 
    @Override 
    protected void onPostExecute(String result) { 
     Toast.makeText(getBaseContext(), result, Toast.LENGTH_LONG).show(); 
     if(instance!=null){ 
      instance.callback(result); 
     } 

    } 

} 

и добавить метод, названный обратный вызов в MainActivity

public class MainActivity extends AppCompatActivity { 
.... your code...... 
    public void callback(String result){ 
    txt.setText(Parse your response); 
    } 
} 

Вам нужно сделать вызов, как следует из mainactivity

new DownloadTextTask(this).execute("http://www.test.com/file.xml"); 
+0

спасибо. извините за мой вопрос, но я скопировал его в моих основных действиях. но обратный вызов не распознается (не может разрешить метод обратного вызова ...), и есть ошибка в классе downoadtexttask. – Saeid

+0

где вы называете новый DownloadTextTask (это)? – Muthu

+0

Работает ли он сейчас? – Muthu

0

набор текста здесь в вашем коде

if (response == HttpURLConnection.HTTP_OK) { 
     in = httpConn.getInputStream(); 
     txt.setText(Parse your response); 
    } 
0

Это будет лучше использовать и XML Parser для извлечения данных из вашего XML-файла в текстовый файл, посмотрите на этот пример

public class XMLParser { 

public static List<Object> parseFeed(String content) { 

    try { 

     boolean inDataItemTag = false; 
     String currentTagName = ""; 
     Object xyz = null; 
     List<Object> xyzList = new ArrayList<>(); 

     XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
     XmlPullParser parser = factory.newPullParser(); 
     parser.setInput(new StringReader(content)); 

     int eventType = parser.getEventType(); 

     while (eventType != XmlPullParser.END_DOCUMENT) { 

      switch (eventType) { 
       case XmlPullParser.START_TAG: 
        currentTagName = parser.getName(); 
        if (currentTagName.equals("product")) { 
         inDataItemTag = true; 
         xyz = new Object(); 
         xyzList.add(xyz); 
        } 
        break; 

       case XmlPullParser.END_TAG: 
        if (parser.getName().equals("product")) { 
         inDataItemTag = false; 
        } 
        currentTagName = ""; 
        break; 

       case XmlPullParser.TEXT: 
        if (inDataItemTag && xyz != null) { 
         switch (currentTagName) { 
          case "productId": 
           xyz.setProductId(Integer.parseInt(parser.getText())); 
           break; 
          case "name": 
           xyz.setName(parser.getText()); 
           break; 
          case "instructions": 
           xyz.setInstructions(parser.getText()); 
           break; 
          case "category": 
           xyz.setCategory(parser.getText()); 
           break; 
          case "price" : 
           xyz.setPrice(Double.parseDouble(parser.getText())); 
           break; 
          case "photo" : 
           xyz.setPhoto(parser.getText()); 
          default: 
           break; 
         } 
        } 
        break; 
      } 

      eventType = parser.next(); 

     } 

     return xyzList; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    }  
} 
} 

это пример XML-анализатора, из XML-файла, имеющего ProductId, Name, Instructions, Price and Photo.

+0

У меня есть парсер, но моя проблема в том, что я не могу скачать xml-файл из сети! – Saeid

+0

Я думаю, что если вам нужно быстро это сделать, просто вставьте свои данные в новый локальный файл XML. –

Смежные вопросы