2015-08-16 4 views
-1

Я делаю просто приложение для Android. Теперь я сделал активность, когда он загружает информацию из Интернета и использует эту информацию для установки списка. Если запустить приложение работает нормально, но если я открываю свою деятельность (который я описал выше), он дает ошибку: android.os.NetworkOnMainThreadExceptionОшибка: android.os.NetworkOnMainThreadException

файл активность:

package com.a3gaatleren; 

import android.support.v7.app.ActionBarActivity; 

import java.io.IOException; 
import java.net.MalformedURLException; 
import java.util.ArrayList; 
import java.util.Arrays; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import com.a3gaatleren.ReadFile; 

public class Agenda extends ActionBarActivity { 


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

       doInBackground(); 

     } 



     protected void doInBackground(){ 
       try { 
         ListView mainListView ; 
         // Find the ListView resource.  
         mainListView = (ListView) findViewById(R.id.listView2); 
         String file_name = "http://3gaatleren.16mb.com/appagenda/agenda.html"; 

         // Create and populate a List of planet names. 
         ReadFile file = new ReadFile(file_name); 

         String[] huiswerk = file.OpenFile(); 
         ArrayList<String> huiswerklist = new ArrayList<String>(); 
         huiswerklist.addAll(Arrays.asList(huiswerk)); 

         // Create ArrayAdapter using the planet list. 
         ArrayAdapter<String> listAdapter; 
         listAdapter = new ArrayAdapter<String>(Agenda.this, R.layout.simplerow, huiswerklist); 

         // Set the ArrayAdapter as the ListView's adapter. 
       mainListView.setAdapter(listAdapter); 

         }catch(MalformedURLException e){ 
           System.out.println(e); 

         }catch(IOException f){ 
           System.out.println(f); 
         } 

     } 





     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
       // Inflate the menu; this adds items to the action bar if it is present. 
       getMenuInflater().inflate(R.menu.agenda, menu); 
       return true; 
     } 

     @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
       // Handle action bar item clicks here. The action bar will 
       // automatically handle clicks on the Home/Up button, so long 
       // as you specify a parent activity in AndroidManifest.xml. 
       int id = item.getItemId(); 
       if (id == R.id.action_settings) { 
         return true; 
       } 
       return super.onOptionsItemSelected(item); 
     } 

} 

Java файл, в котором я определить функция чтения:

package com.a3gaatleren; 

import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.Reader; 
import java.net.URL; 
import java.nio.charset.Charset; 
import java.util.Scanner; 

import org.jsoup.Jsoup; 

import java.io.FileReader; 
import java.io.BufferedReader; 

public class ReadFile { 

     private String path; 

     public ReadFile (String file_path){ 
       path= file_path; 
     } 


     public String[] OpenFile() throws IOException{ 

       URL url = new URL(path); 
       BufferedReader textReader = new BufferedReader(new InputStreamReader(url.openStream())); 
       int numberOfLines=readLines(); 
       String[] textData = new String[numberOfLines]; 

       int i; 

       for (i=0; i< numberOfLines; i++){ 
         String html = textReader.readLine(); 
         org.jsoup.nodes.Document doc; 
         doc = Jsoup.parse(html, "utf-8"); 
         String text = doc.body().text(); 

         textData[i] =text; 
       } 

       textReader.close(); 
       return textData; 

     } 

     int readLines() throws IOException{ 
       URL file_to_read = new URL(path); 
       BufferedReader bf = new BufferedReader(new InputStreamReader(file_to_read.openStream())); 

       int numberOfLines = 0; 

       String str; 

       while ((str = bf.readLine()) != null){ 
         numberOfLines++; 

       } 
       bf.close(); 

       return numberOfLines; 


     } 

} 

Может кто-нибудь сказать мне, в чем проблема?

PS: английский не является моим родным языком, я не знаю, если это правильный английский

+0

Вы читаете файл из сети. Вам не разрешено делать это в основном потоке (он блокирует пользовательский интерфейс). См. 1000+ других вопросов на этом сайте о 'NetworkOnMainThreadException' для метода его решения. – Glorfindel

+0

Я думаю, вам нужно будет использовать AsyncTask с новым потоком, чтобы исправить вашу проблему. Как предложил Глорфиндель, выполните поиск по stackoverflow об этом ... –

ответ

0

В основном поток пользовательского интерфейса является частью вас приложение, которое обрабатывает то, что показано на экране, и давайте пользователю использовать его. Если что-то не отвечает, когда пользователь пытается что-то, то в лучшем случае пользователь считает, что приложение работает медленно, а в худшем случае пользователь считает, что приложение разбилось, а Android плохой, чего мы не хотим.

Чтобы обойти это, мы можем делать все, что требует много времени или много вычислительной мощности в другом потоке. Самый простой способ сделать это - с помощью AsyncTask.

new AsyncTask<Void, Void, Void>() { 

    public void doInBackground(Void... params,) { 
     //do your loading here 
     return null; 
    } 

    public void onPostExecute(Void result) { 
     //update your ui here when loading finishes 
    } 

}.execute(); 

Выше абсолютные голые кости, но должно помочь вам решить вашу проблему

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