2015-06-30 3 views
-2

Я пытаюсь подключиться к серверу, но приложение не подключается, я добавляю privilges, что причина исключения при подключении к серверу

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

и этот адрес URL (вы можете подключиться к нему)

http://justedhak.comlu.com/insert.php 

и это ошибка:

06-30 08:21:15.332: I/System.out(4270): main calls detatch() 
06-30 08:21:15.332: E/Fail 1(4270): android.os.NetworkOnMainThreadException 
06-30 08:21:15.337: E/Fail 2(4270): java.lang.NullPointerException: lock == null 
06-30 08:21:15.337: E/Fail 3(4270): java.lang.NullPointerException 
06-30 08:21:16.802: I/System.out(4270): main calls detatch() 
06-30 08:21:16.802: E/Fail 1(4270): android.os.NetworkOnMainThreadException 
06-30 08:21:16.807: E/Fail 2(4270): java.lang.NullPointerException: lock == null 
06-30 08:21:16.807: E/Fail 3(4270): java.lang.NullPointerException 

это мой код:

public void insert() 
{ 
    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 

nameValuePairs.add(new BasicNameValuePair("id",id)); 
nameValuePairs.add(new BasicNameValuePair("name",name)); 

    try 
    { 
    HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://justedhak.comlu.com/insert.php"); 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 
     is = entity.getContent(); 
     Log.e("pass 1", "connection success "); 
} 
    catch(Exception e) 
{ 
     Log.e("Fail 1", e.toString()); 
     Toast.makeText(getApplicationContext(), "Invalid IP Address", 
     Toast.LENGTH_LONG).show(); 
}  

    try 
    { 
     BufferedReader reader = new BufferedReader 
     (new InputStreamReader(is,"iso-8859-1"),8); 
     StringBuilder sb = new StringBuilder(); 
     while ((line = reader.readLine()) != null) 
    { 
      sb.append(line + "\n"); 
     } 
     is.close(); 
     result = sb.toString(); 
    Log.e("pass 2", "connection success "); 
} 
    catch(Exception e) 
{ 
     Log.e("Fail 2", e.toString()); 
}  

try 
{ 
     JSONObject json_data = new JSONObject(result); 
     code=(json_data.getInt("code")); 

     if(code==1) 
     { 
    Toast.makeText(getBaseContext(), "Inserted Successfully", 
     Toast.LENGTH_SHORT).show(); 
     } 
     else 
     { 
    Toast.makeText(getBaseContext(), "Sorry, Try Again", 
     Toast.LENGTH_LONG).show(); 
     } 
} 
catch(Exception e) 
{ 
     Log.e("Fail 3", e.toString()); 
} 
} 

что может быть отсутствующее?

ответ

3

Android UI спроектирован как одна нить (Главная страница пользовательского интерфейса). Поэтому, чтобы не допустить каких-либо перерывов в пользовательском интерфейсе, вы не можете выполнять сетевые вызовы в потоке пользовательского интерфейса.

С Androidv2.3 (я думаю) они представили это исключение, так что неправильные методы кодирования не влияют на общий опыт Android.

Вам придется совершать звонки в отдельной теме. Android предоставляет простую оболочку над обычным Java Runnable (или Thread), который называется (довольно творчески) AsyncTask. Это ссылка на documentation. (Вы можете попросить Google дяде, а он все знает)

короткий пример использования (бессовестно скопированный с Android сайта Dev):

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
    protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100)); 
      // Escape early if cancel() is called 
      if (isCancelled()) break; 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     setProgressPercent(progress[0]); 
    } 

    protected void onPostExecute(Long result) { 
     showDialog("Downloaded " + result + " bytes"); 
    } 
} 

, а затем от вашего звонка активность

new DownloadFilesTask().execute(url1, url2, url3); 
+0

Ваш вопрос полон подробностей, я совершенно новичок в подключении к серверу. в любом случае больной читал больше об асинхронной задаче. но еще один вопрос, есть ли другой тип задачи asny? Я имею в виду каждый раз, когда мне нужно подключиться к серверу, я должен использовать async-задачу? или есть другой метод? – Moudiz

+1

Идея состоит в том, что вам нужно создать новый экземпляр AsyncTask каждый раз, когда вы выполняете сетевую операцию (в идеале любую операцию ввода-вывода). Вы можете вызвать execute из экземпляра AsyncTask (или его дочерних элементов) только один раз, поэтому вам нужно будет создать экземпляр каждый раз, когда вам нужно его использовать. Как показано в исходном ответе, вы расширяете платформу AsyncTask <> и создаете свои собственные классы, каждый из которых выполняет разные операции. например LoginAsyncTask, RegisterAsyncTask, ForgotPasswordAsyncTask и т. Д. И т. Д. Надеюсь, это поможет. –

1

Здесь вы вызываете сеть в Основной поток, который не разрешен. Вы можете решить эту проблему двумя способами:

  1. Сделать сетевой вызов в doInBackground AsyncTask.
  2. Используйте строгий режим, если вы не хотите использовать AsyncTask.
Смежные вопросы