等到socket作为服务可用

时间:2016-08-30 08:01:27

标签: java android multithreading service socket.io

我已经阅读过Thread sleep,Handler,Runnable,AsyncTask和TimerTask,尝试了线程睡眠,但无法弄清楚如何完成任务。

我已经实施socket.io.client-java作为服务并使用Volley以及多项活动&片段。我需要如下:

  • 在发出Volley请求之前检查插座是否已连接。
  • 如果已连接套接字,则处理Volley请求,否则重新检查套接字连接(最多5次,间隔为1秒)。
  • 如果5次尝试失败,请显示Toast消息并继续Volley请求。

我正在使用一个公共类来执行Volley请求和其他人。

套接字服务

public class SocketClient extends Service {

private Socket mSocket = null;
private static SocketClient iSocket;

public SocketClient() {
    super();
}

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

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return super.onStartCommand(intent, flags, startId);
}

@Override
public void onCreate(){
    super.onCreate();
    iSocket = this;
    startSocket();
}

public static synchronized SocketClient getInstance(){return iSocket;}

private void startSocket(){        

    try {
        mSocket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {

            @Override
            public void call(Object... args) {
                //...
            }

        }).on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {

            @Override
            public void call(Object... args) {
                //...
            }

        }).on(...{...});

        mSocket.connect();

    } catch (URISyntaxException e){
        e.printStackTrace();
    }

}

public boolean isConnected(){ return (mSocket != null && mSocket.connected()); }

@Override
public void onDestroy(){
    super.onDestroy();
    mSocket.disconnect().close();
    mSocket = null;
}
}

活动

@Override
protected void onCreate(Bundle savedInstanceState) {
    //...
    Helpers.startServices(getApplicationContext(), 1);
}

@Override
protected void onResume() {
    Helpers.getNotifed();   //A Volley Request
}

助手类

public static void makeReq(Map<String, Object> params, String api, final Context context, final VolleyListener listener)
{
    manager = new SessionManager(context);
    final String url = baseURL + api;

    int i = 0;
    boolean ss = SocketClient.getInstance().isConnected();
    Log.i(TAG, "Socket status" + ss);
    while(i < 5 && !ss) {
        try {
            Log.i(TAG, "Socket status" + ss);
            Log.i(TAG, "sleeping " + i);
            Thread.sleep(1000);
            ss = SocketClient.getInstance().isConnected();
            i++;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    if(!ss)
        Toast.makeText(context, "Operation interrupt!", Toast.LENGTH_LONG).show();


    //Volley JSON Object Request
}    

public static void startServices(Context context, int st) {
    switch (st) {
        case 1: //Socket
            if (!isServiceRunning(context, SocketClient.class))
                context.startService(new Intent(context, SocketClient.class));
            break;            
    }
}

的问题:

  • boolean ss = SocketClient.getInstance().isConnected();获取NullPointerException,因为类可能尚未初始化。
  • ANR(应用程序无响应)因为主线程在while循环中停止。

P.S。:我只是Android / Java的初学者,所以回复清晰的代码会很明显。

0 个答案:

没有答案