2014-02-05 4 views
0

Я пытаюсь скопировать фрагмент HttpURLConnection с страницы разработчика Android в мой проект, чтобы увидеть, могу ли я подключиться к Интернету, и каждый раз, когда я запускаю функцию, мое приложение закрывается. я не уверен, почему приложение терпит неудачу, и любая помощь будет оценена по достоинству. этот код помещаются внутри public class main extends Activityотправка запроса http-url

Main.java:

public void showHelp() throws IOException { 
     URL url = new URL("http://www.android.com/"); 
     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
     try{ 
      InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 
      //readStream(in); 
     } finally{ 
      urlConnection.disconnect(); 
     } 
    } 

я закомментирована ReadStream, потому что я думал, что преобразование может быть проблема, но это еще не дело. эта функция:

private String readStream(InputStream is) { 
     try { 
      ByteArrayOutputStream bo = new ByteArrayOutputStream(); 
      int i = is.read(); 
      while(i != -1) { 
      bo.write(i); 
      i = is.read(); 
      } 
      return bo.toString(); 
     } catch (IOException e) { 
      return ""; 
     } 
    } 

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

<uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

включены в андроида манифеста XML

ошибка LogCat:

02-04 21:27:14.468: W/dalvikvm(16978): threadid=1: thread exiting with uncaught exception (group=0x4208d2a0) 
02-04 21:27:14.492: E/AndroidRuntime(16978): FATAL EXCEPTION: main 
02-04 21:27:14.492: E/AndroidRuntime(16978): android.os.NetworkOnMainThreadException 
02-04 21:27:14.492: E/AndroidRuntime(16978): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at java.net.InetAddress.getAllByName(InetAddress.java:214) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at libcore.net.http.HttpEngine.connect(HttpEngine.java:310) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at com.MeadowEast.audiotest.MainActivity.showHelp(MainActivity.java:369) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at com.MeadowEast.audiotest.MainActivity.onOptionsItemSelected(MainActivity.java:97) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at android.app.Activity.onMenuItemSelected(Activity.java:2625) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1061) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at com.android.internal.view.menu.ListMenuPresenter.onItemClick(ListMenuPresenter.java:179) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at android.widget.AdapterView.performItemClick(AdapterView.java:298) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at android.widget.AbsListView.performItemClick(AbsListView.java:1280) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at android.widget.AbsListView$PerformClick.run(AbsListView.java:3083) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at android.widget.AbsListView$1.run(AbsListView.java:3983) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at android.os.Handler.handleCallback(Handler.java:615) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at android.os.Handler.dispatchMessage(Handler.java:92) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at android.os.Looper.loop(Looper.java:137) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at android.app.ActivityThread.main(ActivityThread.java:4949) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at java.lang.reflect.Method.invokeNative(Native Method) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at java.lang.reflect.Method.invoke(Method.java:511) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1043) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:810) 
02-04 21:27:14.492: E/AndroidRuntime(16978): at dalvik.system.NativeStart.main(Native Method) 

новый код AsyncTask:

private abstract class myTask extends AsyncTask<String,Void,Void>{ 
     protected void doInBackground(String addressName) throws IOException { 
      URL url = new URL(addressName); 
      HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
      try{ 
       InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 
       //readStream(in); 
      } finally{ 
       urlConnection.disconnect(); 
      } 
     } 

     protected void onProgressUpdate() { 
      //do nothing 
     } 

     protected void onPostExecute() { 
      //toast me 
     } 
    } 

вызывается из:

public void showHelp(){ 
     new myTask().execute("http://www.android.com/"); 
    } 

я не могу загрузить на устройство Android я получаю эту проблему: Невозможно создать тип main.mytask

+0

какая ошибка поживаешь? –

+0

Опубликуйте свой логарифм. С какой версией Android вы тестируете? – rubenlop

+0

сделано и Android 4.1.2 с целевым API19 – blu

ответ

0

Посмотрите ваш LogCat, ваша проблема NetworkOnMainThreadException так, чтобы положить ваш URLConnection в других нить

new Thread(new Runnable() { 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     showHelp(); 
    } 
}).start(); 
+0

ваш код не разбился и, кажется, работает (мне нужно его проверять), но я не понимаю, что вы можете рассказать мне немного больше о том, что он делает. – blu

+0

В андроиде вы не можете выполнять сетевое действие в mainThread, потому что это приведет к задержке пользовательского интерфейса, так что если вы хотите сделать сетевое действие, вам нужно сделать это в другом потоке.код, который я отправляю, является одним из способов, а другим способом является использование AsyncTask – henry4343

+0

. Вы также можете проверить этот учебник.http: //developer.android.com/reference/android/os/AsyncTask.html – henry4343

0

Одна из причин, я могу думать о том, что вы размещаете сети связи в главном потоке. Вам не разрешено это делать. Вы можете использовать AsyncTask

http://developer.android.com/reference/android/os/AsyncTask.html 

Для тестирования вы можете добавить следующее в основной деятельности, но это считают плохой практикой.

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 
+0

Хорошо, я попробую и вернусь. Я попытался создать AsyncTask раньше, но я не мог заставить его работать, поэтому я попытался использовать основной поток, не сохраняя код. также должен ли этот новый класс быть создан в другом файле и как я его назвал бы из основного? – blu

+0

На самом деле рекомендуется использовать AsyncTask в качестве внутреннего класса. Поэтому вы можете добавить его в свой текущий класс. –

+0

Я внес некоторые изменения, но я сделал что-то не так, теперь я не могу запустить код. отправил ошибку в нижней части основного вопроса – blu

0

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

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