java - 当 http 连接超时时为 TextView 设置文本

标签 java android

当 http 连接超时作为错误消息时,我需要为 TextView 设置文本 我需要在 MainActivity.java 上完成此操作,但请求是从 QueryUtils.java 发出的 我尝试使用 findViewByid 来做到这一点,但由于使用静态方法观察错误而出现错误 这是我的 QueryUtils,java

package com.example.android.mynewsx2;


    import android.net.Uri;
    import android.util.Log;

    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.nio.charset.Charset;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Locale;

    /**
     * Created by Person on 11/08/2018.
     */

    public class QueryUtils {

        public boolean connTimeout = false;
        static String createStringUrl() {
            Uri.Builder builder = new Uri.Builder();
            builder.scheme("http")
                    .encodedAuthority("content.guardianapis.com")
                    .appendPath("search")
                    .appendQueryParameter("order-by", "newest")
                    .appendQueryParameter("show-references", "author")
                    .appendQueryParameter("show-tags", "contributor")
                    .appendQueryParameter("page-size", "175")
                    .appendQueryParameter("q", "")
                    .appendQueryParameter("api-key", "c15d8295-7691-4172-a257-a7d065668eb4");
            String url = builder.build().toString();
            return url;
        }

        static URL createUrl() {
            String stringUrl = createStringUrl();
            try {
                return new URL(stringUrl);
            } catch (MalformedURLException e) {
                Log.e("Queryutils", "Error creating URL: ", e);
                return null;
            }
        }

        private static String formatDate(String rawDate) {
            String jsonDatePattern = "yyyy-MM-dd'T'HH:mm:ss'Z'";
            SimpleDateFormat jsonFormatter = new SimpleDateFormat(jsonDatePattern, Locale.US);
            try {
                Date parsedJsonDate = jsonFormatter.parse(rawDate);
                String finalDatePattern = "MMM d, yyy";
                SimpleDateFormat finalDateFormatter = new SimpleDateFormat(finalDatePattern, Locale.US);
                return finalDateFormatter.format(parsedJsonDate);
            } catch (ParseException e) {
                Log.e("QueryUtils", "Error parsing JSON date: ", e);
                return "";
            }
        }

        static String makeHttpRequest(URL url) throws IOException {
            String jsonResponse = "";

            if (url == null){
                return jsonResponse;
            }
            HttpURLConnection urlConnection = null;
            InputStream inputStream = null;

            try {
                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setRequestMethod("GET");
                urlConnection.setReadTimeout(10000 /* milliseconds */);
                urlConnection.setConnectTimeout(15000 /* milliseconds */);
                urlConnection.connect();
                if (urlConnection.getResponseCode() == 200){
                    inputStream = urlConnection.getInputStream();
                    jsonResponse = readFromStream(inputStream);
                } else {
                    Log.e("mainActivity", "Error response code: " + urlConnection.getResponseCode());

                }
            } catch (IOException e) {
                Log.e("Queryutils", "Error making HTTP request: ", e);
            } finally {
                if (urlConnection != null) {
                    urlConnection.disconnect();
                }
                if (inputStream != null) {
                    inputStream.close();
                }
            }
            return jsonResponse;
        }

        private static String readFromStream(InputStream inputStream) throws IOException {
            StringBuilder output = new StringBuilder();
            if (inputStream != null) {
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));
                BufferedReader reader = new BufferedReader(inputStreamReader);
                String line = reader.readLine();
                while (line != null) {
                    output.append(line);
                    line = reader.readLine();
                }
            }
            return output.toString();
        }

        static List<News> parseJson(String response) {
            ArrayList<News> listOfNews = new ArrayList<>();
            try {
                JSONObject jsonResponse = new JSONObject(response);
                JSONObject jsonResults = jsonResponse.getJSONObject("response");
                JSONArray resultsArray = jsonResults.getJSONArray("results");

                for (int i = 0; i < resultsArray.length(); i++) {
                    JSONObject oneResult = resultsArray.getJSONObject(i);
                    String webTitle = oneResult.getString("webTitle");
                    String url = oneResult.getString("webUrl");
                    String date = oneResult.getString("webPublicationDate");
                    date = formatDate(date);
                    String section = oneResult.getString("sectionName");
                    JSONArray tagsArray = oneResult.getJSONArray("tags");
                    String author = "";

                    if (tagsArray.length() == 0) {
                        author = null;
                    } else {
                        for (int j = 0; j < tagsArray.length(); j++) {
                            JSONObject firstObject = tagsArray.getJSONObject(j);
                            author += firstObject.getString("webTitle") + ". ";
                        }
                    }
                    listOfNews.add(new News(webTitle, author, url, date, section));
                }
            } catch (JSONException e) {
                Log.e("Queryutils", "Error parsing JSON response", e);
            }
            return listOfNews;
        }
    }

最佳答案

这可以使用回调(接口(interface))来完成。

以下代码 fragment 是您必须执行的操作:

static String makeHttpRequest(URL url, OnTimeOutListener listener) throws IOException {
    String jsonResponse = "";

    if (url == null) {
        return jsonResponse;
    }
    HttpURLConnection urlConnection = null;
    InputStream inputStream = null;

    try {
        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setRequestMethod("GET");
        urlConnection.setReadTimeout(10000 /* milliseconds */);
        urlConnection.setConnectTimeout(15000 /* milliseconds */);
        urlConnection.connect();
        if (urlConnection.getResponseCode() == 200) {
            inputStream = urlConnection.getInputStream();
            jsonResponse = readFromStream(inputStream);
        } else {

            //Call this when time out happens
            listener.onTimeOut();
            Log.e("mainActivity", "Error response code: " + urlConnection.getResponseCode());

        }
    } catch (IOException e) {
        Log.e("Queryutils", "Error making HTTP request: ", e);
    } finally {
        if (urlConnection != null) {
            urlConnection.disconnect();
        }
        if (inputStream != null) {
            inputStream.close();
        }
    }
    return jsonResponse;
}

interface OnTimeOutListener {
    void onTimeOut();
}

在您的 MainActivity 中,您必须以这种方式调用 makeHttpRequest

QueryUtils.makeHttpRequest(url, new OnTimeOutListener() {
        @Override
        public void onTimeOut() {
          //Handle your call timeout.
        }
    });

希望这对您有所帮助。

关于java - 当 http 连接超时时为 TextView 设置文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51820827/

相关文章:

java - 如何在java中返回多个整数?

java - 从流中获取最后 n 个元素

Android YouTube API : Can't reinitialize YouTubePlayerFragment with new YouTube video

android - Retrofit/RxJava - 获取http响应码

android - 如何编辑 .APK 文件中的 list

android - 使用 Facebook SDK Android 获取用户 ID 和电子邮件

java - Spring 绑定(bind) : how to work with something like map?

java - 与 RxJava 并行处理 IO 密集型任务列表

java - 音频文件未在Java中播放

Android - 如何从多个 SQLite 表中检索数据?