Приложение Android остановлено при попытке получить данные из Интернета

Я пытаюсь получить данные из Интернета с помощью HttpGet и HttpClient. Однако, когда я запускаю его в своем эмуляторе, он сразу же выключается, говоря: «К сожалению, имя приложения остановлено». Есть идеи, как это решить?

Код:

public class MainActivity extends Activity {

    final String httpPath = "http://www.google.com";    


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

        TextView txtContent = (TextView) findViewById(R.id.txtContent);

        TextView tvHttp = (TextView) findViewById(R.id.tvHttp);

        HttpClient httpclient = new DefaultHttpClient();
        HttpGet httpget = new HttpGet(httpPath);
        try {

            HttpEntity httpEntity = httpclient.execute(httpget).getEntity();

           if (httpEntity != null){
            InputStream inputStream = httpEntity.getContent();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuilder stringBuilder = new StringBuilder();

            String line = null;

            while ((line = bufferedReader.readLine()) != null) {
                stringBuilder.append(line + "\n");
            }

            inputStream.close();

            tvHttp.setText(stringBuilder.toString());
           }

        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Toast.makeText(MainActivity.this, e.toString(), Toast.LENGTH_LONG).show();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Toast.makeText(MainActivity.this, e.toString(), Toast.LENGTH_LONG).show();
      }
AssetManager assetManager = getAssets();


// To load text file
InputStream input;
try {
    input = assetManager.open("dummytext.txt");

     int size = input.available();
     byte[] buffer = new byte[size];
     input.read(buffer);
     input.close();

     // byte buffer into a string
     String text = new String(buffer);

     txtContent.setText(text);
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();}

}



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

Логкат:

03-08 03:31:17.762: D/AndroidRuntime(892): Shutting down VM
03-08 03:31:17.762: W/dalvikvm(892): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
03-08 03:31:17.952: E/AndroidRuntime(892): FATAL EXCEPTION: main
03-08 03:31:17.952: E/AndroidRuntime(892): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.appname/com.example.appname.MainActivity}: android.os.NetworkOnMainThreadException

person user2146966    schedule 08.03.2013    source источник


Ответы (3)


android.os.NetworkOnMainThreadException

Это означает, что вы выполняете сетевые вызовы в потоке Main UI.

Все вызовы, связанные с Http в вашем onCreate(), должны быть перемещены в AsyncTask.

person RainMaker    schedule 08.03.2013
comment
Как мне переместить его в AsyncTask? - person user2146966; 08.03.2013
comment
Ссылка, которую я предоставил, содержит всю основную информацию о AsyncTask. Как только вы это узнаете, переместите все фрагменты кода, связанные с Http(Интернет), в doInBackground() и вызовите execute() из AsyncTask в onCreate(). - person RainMaker; 08.03.2013
comment
проверьте этот пример, если хотите. - person RainMaker; 08.03.2013
comment
Я переместил весь свой код, связанный с http, в асинтаск в doInBackground(), и я уже выполняю его в своем onCreate(), теперь приложение открывается, но через некоторое время показывает сообщение об ошибке и снова закрывает приложение. И мне до сих пор не удалось успешно получить данные из Интернета, которые будут отображаться в моем текстовом представлении :( - person user2146966; 08.03.2013

    class DownloadTask extends AsyncTask<Void,Void,Void>
{
  protected void onPreExecute() 
  {
  super.onPreExecute();  
    //show progress dialog()
  }

 @Override
 protected Void doInBackground(Void... params) {
   //get data form internet here
   // put all downloading related code in a method getDownload()
   // call  getDownload() here
 return null;
 }

 @Override
  protected void onPostExecute(Void result) {
  super.onPostExecute(result);
   //dismiss dialog update ui here
   // uodate ur ui with the downloaded data here
   }
 }

Используйте приведенное выше для AsyncTask

В качестве альтернативы вы можете взглянуть на этот проект с открытым исходным кодом в gitup, который использует robospice для длительных операций. https://github.com/octo-online/robospice.

person Raghunandan    schedule 08.03.2013

Вот отличный пример от vogela, чтобы понять, как использовать AsynckTask в Android.

Вы можете пойти и поместить свой сетевой вызов в doBackground этой задачи.

Надеюсь, вы уловили суть.

person Shreyash Mahajan    schedule 08.03.2013