2017-06-15 45 views
1

如何使用Android ServiceAsyncTask?有可能(或)不可能?如何使用AsyncTask服務?

我想實現套接字消息接收器。我的UI線程和AsyncTask用於套接字消息接收器創建,但我的應用程序工作緩慢,所以我需要任何其他解決方案。

Runnable mHandlerTask; 
Handler mHandler; 

void init() { 
    mHandler = new Handler(); 
    mHandlerTask = new Runnable(){ 
     @Override 
     public void run(){ 
      Scoketvalue_Reciver(); 
      mHandler.postDelayed(mHandlerTask, INTERVAL); 
     } 
    }; 
} 

private void Scoketvalue_Reciver() { 
    new MainActivity.FileServerAsyncTask(this,info).execute(); 
} 

void startRepeatingTask(){ 
    mHandlerTask.run(); 
} 

void stopRepeatingTask(){ 
    mHandler.removeCallbacks(mHandlerTask); 
} 



public FileServerAsyncTask(Context context , WifiP2pInfo info){ 
      this.context = context; 
      this.info = info; 
     } 

     @Override 
     protected String doInBackground(Void... params){ 
      try{ 
       ServerSocket serverSocket; 
       serverSocket = new ServerSocket(8988); 
       Socket client = serverSocket.accept(); 
       Log.d("vishnu ","getInetAddress ::"+client.getInetAddress()); 
       if(info.isGroupOwner) { 
        Utils.clientipAddress = String.valueOf(client.getInetAddress().getHostAddress()); 
       } 
       BufferedReader input = new BufferedReader(new InputStreamReader(client.getInputStream())); 
       String st = null; 
       st = input.readLine(); 
       serverSocket.close(); 
       return st; 
      } catch (IOException e) { 
       Log.e(TAG, e.getMessage()); 
       return null; 
      } 
     } 

     /* 
     * (non-Javadoc) 
     * @see android.os.AsyncTask#onPostExecute(java.lang.Object) 
     */ 
     @Override 
     protected void onPostExecute(String result) { 
      if (result != null) { 
       Toast.makeText(context.getApplicationContext(),"value "+result,Toast.LENGTH_SHORT).show(); 
       MainActivity.sentpickedholeid(result); 
//    statusText.setText("File copied - " + result); 
      } 
     } 

     /* 
     * (non-Javadoc) 
     * @see android.os.AsyncTask#onPreExecute() 
     */ 
     @Override 
     protected void onPreExecute() { 
//   statusText.setText("Opening a server socket"); 
     } 
    } 
+0

你試過我提出的解決方案嗎? – Oleksandr

回答

0

我會建議使用WebSocket from okhttp,由廣場開發,而不是使用基於AsyncTasks或線程自己的實現。

您需要onCreate()方法來初始化的WebSocket和實施WebSocketListener從套接字接收消息/錯誤:

public class YourService extends Service { 
    WebSocket ws; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     startWebSocket(); 
    } 

    private void startWebSocket() { 
     Request request = new Request.Builder().url("ws://echo.websocket.org").build(); 
     WebSocketListener listener = new YourWebSocketListener(); 
     ws = client.newWebSocket(request, listener); 
    } 
} 

檢查this official square example瞭解如何實現YourWebSocketListener