2017-02-11 4 views
0

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

 thread = new Thread() { 
      @Override 
      public void run() { 
       //server stuff 
       try { 
        //Connecting 
        if(!userClass.equals("")) { 
         Log.i(debugString, "Attempting to connect to server"); 
         socket = new Socket(hostname, portnumber); 
         Log.i(debugString, "Connection established!"); 
         BufferedWriter bw = new BufferedWriter((new OutputStreamWriter(socket.getOutputStream()))); 
         bw.write("" + userClass); 
         bw.newLine(); 
         bw.flush(); 

         BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
         input = br.readLine(); 
        } 

       } catch (IOException e) { 
        Log.e(debugString, e.getMessage()); 
       } finally { 
        threadComplete = true; 
       } 
      } 
     }; 
     thread.start(); 

    while(!threadComplete) 
     continue; 

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

 String getUserClass = userClass; 
    if(!getUserClass.equals("")) 
    { 
     threadComplete = false; 
     userClass = getUserClass; 
     thread.start(); 

     while (!threadComplete) 
      continue; 

     changes.setText(input); 
    } 
    else Toast.makeText(this, "Error, choose your class", Toast.LENGTH_SHORT).show(); 

Кстати, в конце каждого нить (на эмуляторе, потому что на моем телефоне он выходит из строя) я получаю сообщение: Skipped 91 frames! The application may be doing too much work on its main thread.

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

 synchronized (this) { 
     int count = 0; 
     while (count<4) { 

      try { 
       wait(3000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

      if (notifications && !userClass.equals("")) { 

       new Thread() { 
        @Override 
        public void run() { 
         //server stuff 
         try { 
          //Connecting 
          if (!userClass.equals("")) { 
           Log.i("debug", "Attempting to connect to server"); 
           socket = new Socket(hostname, portnumber); 
           Log.i("debug", "Connection established!"); 
           BufferedWriter bw = new BufferedWriter((new OutputStreamWriter(socket.getOutputStream()))); 
           bw.write("" + userClass); 
           bw.newLine(); 
           bw.flush(); 

           BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
           input = br.readLine(); 
          } 

         } catch (IOException e) { 
          Log.e("debug", e.getMessage()); 
         } finally { 
          complete = true; 
         } 
        } 
       }.start(); 

       while (!complete) 
        continue; 

       Toast.makeText(this, "" + input, Toast.LENGTH_SHORT).show(); 


       NotificationManager mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
       NotificationCompat.Builder mBuilder = 
         new NotificationCompat.Builder(this) 
           .setSmallIcon(R.drawable.chanka) 
           .setContentTitle("ביטול שיעורים: ") 
           .setContentText(input); 

       mNotifyMgr.notify(mNotificationId, mBuilder.build()); 
       mNotificationId++; 

       Toast.makeText(this, "" + input, Toast.LENGTH_SHORT).show(); 
       count++; 
      } 
     } 
    } 
+0

убедитесь, что 'hostname url' является вашим личным ip – samirk433

+0

@ samir.k433 Это не проблема, подключение работает, и я также создал java-сервер. Проблема в том, что соединение работает только тогда, когда я использую свой эмулятор ПК, и когда я пытаюсь запустить его на своем LG G3, он просто падает после запуска потока. , а также я получаю проблему: «Пропустили 91 фрейм! Приложение может слишком много работать над своим основным потоком. «В журнале, поэтому я считаю, что моя программа недостаточно эффективна, и тяжело работать для мобильного телефона, и я просто не знаю, как заставить ее работать и более эффективно. –

ответ

0

Это следующий фрагмент кода является виновником -

while (!threadComplete) 
    continue; 

Вы вроде сдачи основной поток на длинной петле. Android этого не позволяет. Общая конструкция в такого рода случаях используют это -

Шаг 1 - Показать прогресс диалоговое окно для пользователя о том, что вы делаете что-то важным и пользователь должен ждать, пока что завершена. Покажите какой-то значащий текст в диалоговом окне прогресса, которое делает смысл пользователю.

Шаг 2 - Запустите асинхронное соединение с сервером. В Android есть много опций . Но для вашей цели AsyncTask может быть полезным. Подключите к вашему серверу, выберите и проанализируйте данные в doInBackground метод AsyncTask и после завершения задачи let onPostExecute опубликуйте то же самое в Главной теме.

Шаг 3 - После того как вы вернете результат задачи Async, вы можете отменить диалог прогресса и продолжить все, что вы делали.

Обратите внимание, что основная нить не должна блокироваться в любое время. Это поток обработки событий приложения и обрабатывает все события (инициируется пользователем или инициируется системой). Если поток заблокирован, вы получаете вид ошибки, которую видите сейчас. В частности, в вашем случае система Android не может выполнять некоторые операции ничьей из-за цикла while.

+0

Хорошо, что он отлично поработал, но у меня все еще есть проблема, что мой сервис прекратится, если я установил задержку между каждой проверкой более 10 секунд. Это мой код для сервиса: 'protected void onHandleIntent (намерение намерения) { синхронизировано (это) { новый StartChecking(). Start ((long) 7000); } } ' –

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