【问题标题】:How to use service with AsyncTask?如何将服务与 AsyncTask 一起使用?
【发布时间】:2017-11-17 13:01:58
【问题描述】:

如何使用Android ServiceAsyncTask?有可能(或)不可能吗?

我正在尝试实现套接字消息接收器。我已经 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");
        }
    }

【问题讨论】:

  • 你试过我提出的解决方案了吗?

标签: android sockets service websocket android-asynctask


【解决方案1】:

我建议使用 Square 开发的 WebSocket from okhttp,而不是使用您自己的基于 AsyncTasks 或 Threads 的实现。

您需要在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

【讨论】:

    猜你喜欢
    • 2011-09-12
    • 2012-03-18
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    相关资源
    最近更新 更多