2017-02-11 14 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ミリ秒以上待つ時間を設定すると、サービスがクラッシュするということだ。 バックグラウンドサービスのための私のコード: - あなたは一種の長いループにメインスレッドを入れている

while (!threadComplete) 
    continue; 

 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

ホスト名urlがあなたのプライベートIPであることを確認してください – samirk433

+0

@ samir.k433これは問題ではなく、接続が機能していて、私もjavaサーバを作ったのです。問題は、私のPCエミュレータを使用しているときにのみ接続が動作し、私はLG G3でそれを起動しようとすると、スレッドが起動するとただクラッシュするということです。 また、問題が発生します: '91フレームをスキップしました!アプリケーションはメインスレッドであまりにも多くの作業をしている可能性があります。」ログでは、私のプログラムは十分に効率的ではなく、携帯電話で走るのは重いと思うし、どうやって動作させるのか分からないより効率的です。 –

答えて

0

このコードの以下の部分は犯人です。 Androidではこれが許可されていません。使用例これらの種類の一般的な構造はこれです -

ステップ1 - ユーザーに進捗ダイアログを表示し、あなたが重要な何かを やっていることを示すと、ユーザはそれが 完了するまで待つ必要があります。進捗ダイアログに意味のあるテキストを表示すると、 はユーザーに意味があります。

ステップ2 - サーバーへの非同期接続を開始します。これを行うにはAndroidに多くの オプションがあります。しかしあなたの目的のためにAsyncTaskかもしれないかもしれない 有用である。サーバーに接続し、 doInBackgroundメソッドのデータを取得して解析します。AsyncTaskを実行し、タスクが完了したら onPostExecuteをメインスレッドにパブリッシュします。

ステップ3 - 非同期タスクから結果を取得したら、 進捗ダイアログを閉じて、何をしていたとしても続行することができます。

メインスレッドはいつでもブロックしないように注意してください。これは、アプリケーションのスレッドを処理するイベントで、すべてのイベント(ユーザーが開始したシステムまたはシステムが開始したイベント)を処理します。スレッドがブロックされている場合は、今見ている種類のエラーが発生します。あなたのケースでは、Androidシステムはwhileループのためにいくつかの描画操作を行うことができません。

+0

うーん、うまくいきましたが、各チェックの間に10秒以上遅延を設定すると、サービスが停止するという問題が残ります。これはサービスのコードです: 'protected void onHandleIntent(Intent intent){ { new StartChecking()。start((long)7000); } } ' –