2017-06-15 80 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