【问题标题】:Server response Timeout function in parse.com androidparse.com android中的服务器响应超时功能
【发布时间】:2014-12-09 11:09:52
【问题描述】:

我正在开发 parse.com android 应用程序。就像在正常的 http 请求中一样,如果我们在特定时间内没有从服务器获得响应,那么它将显示超时功能。例如,我的以下代码适用于 http 请求超时:

            HttpsURLConnection connection = null;
            connection = (HttpsURLConnection) serverAddress.openConnection();
            connection.setRequestMethod("GET");
            connection.setDoOutput(true);
            connection.setHostnameVerifier(DO_NOT_VERIFY);         
            connection.setReadTimeout(3*1000);

现在我想要 parse.com 中的相同功能,如果由于 Internet 连接问题等任何原因我无法从解析服务器获得响应,那么它会给我超时。

提前致谢。

【问题讨论】:

    标签: android parse-platform timeout session-timeout


    【解决方案1】:

    Parse.com SDK 没有您在问题中描述的此类功能。

    但是你可以做一些技巧,例如,在ParseQuery 存在方法cancel()。因此,如果您希望超时小于标准超时,您可以在后台运行查询,然后等待或查询回调将传递它的结果,或者您的超时实现将取消查询运行。

    更新:

    public class TimeoutQuery<T extends ParseObject> {
        private ParseQuery<T> mQuery;
        private final long mTimeout;
        private FindCallback<T> mCallback;
        private final Object mLock = new Object();
        private final Thread mThread;
    
    
        public TimeoutQuery(ParseQuery<T> query, long timeout) {
            mQuery = query;
            mTimeout = timeout;
            mThread = new Thread() {
                @Override
                public void run() {
                    if (isInterrupted()) return;
                    try {
                        Thread.sleep(mTimeout);
                    } catch (InterruptedException e) {
                        return;
                    }
                    cancelQuery();
                }
            };
        }
    
        private void cancelQuery() {
            synchronized (mLock) {
                if (null == mQuery) return; // it's already canceled
                mQuery.cancel();
                new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        mCallback.done(Collections.<T>emptyList(), new ParseException(ParseException.TIMEOUT, ""));
                    }
                });
            }
        }
    
        public void findInBackground(final FindCallback<T> callback) {
            synchronized (mLock) {
                mCallback = callback;
                mQuery.findInBackground(new FindCallback<T>() {
                    @Override
                    public void done(List<T> ts, ParseException e) {
                        synchronized (mLock) {
                            mThread.interrupt();
                            mQuery = null;
                            mCallback.done(ts, e);
                        }
                    }
                });
                mThread.start();
            }
        }
    }
    

    用法:

     ParseQuery<ParseObject> query = ParseQuery.getQuery("Test");
     new TimeoutQuery<>(query, 1000).findInBackground(new FindCallback<ParseObject>() {
        ...
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 2021-04-18
      相关资源
      最近更新 更多