0

アクティビティからサービスを開始しています。ここでの問題は、サービスが開始されてもアクティビティが表示されないことです。

@Override
protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.main);
           startService(new Intent(this, ServerActivity1.class));

        }

サービスでは、タイマーを使用してこのような単純な関数を介してソケットを開いています。ログで確認できるようにサービスが開始されますが、ビュー(R.layout.main)は表示されず、しばらくすると力がクローズポップが表示されます。

    @Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    Toast.makeText(this, "sasa", Toast.LENGTH_SHORT).show();
    timer.scheduleAtFixedRate( new TimerTask() {
        public void run() {
            read();

        } 
    }, 0,50000);
    Log.i("NoServer","Started1");   
    read();

}

@Override
public void onDestroy() {

}

@Override
public void onStart(Intent intent, int startid) {
     Log.i("Home","Listening on IP: " + SERVERIP+"\n");
}


public  void  read()
{
    SERVERIP = getLocalIpAddress();
   Log.i("Home","Listening on IP: " + SERVERIP+"\n");
               if (SERVERIP != null) {
                Log.i("Home","Listening on IP: " + SERVERIP+"\n");
                }
                try {
                    serverSocket = new         ServerSocket(SERVERPORT);
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
                   while (true) {
                      Socket client;
                      Log.i("Home","Listening on IP: " + SERVERIP+"\n");
                    try {
                            client = serverSocket.accept();
                            Log.i("Home","Listening on IP: " + SERVERIP+"\n");
                           BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                            while ((line = in.readLine()) != null) {                                                            
                            serverSocket.close();
                            read();
                        }

                       } catch (Exception e) {

                           e.printStackTrace();
                       }
                   }
          } 
4

1 に答える 1

1

マニフェストの別のプロセスでサービスを定義しない限り、UI スレッド ( main ) がサービスによって共有されているためです。アクティビティのonResumeメソッドでサービスを開始すると、それまではサービスが表示されますが、サービスでリクエストを完了するのにかかる時間 (最大 5 秒) によってはANRが発生する可能性があります。

サービスのすべてのソケット (または高価な呼び出し) を別のスレッドに配置することをお勧めします。その場合、ANR が原因でアプリがハングしたりクラッシュしたりすることはありません。

Service 内の別のスレッドでMessagesRunnablesを実行するにはThreadHandler、 andを使用する必要があります。Handler

于 2012-05-15T06:29:48.450 に答える