java - 使用 AsyncTask 时无法从 HttpURLConnection.getResponseCode 接收值?

标签 java android android-asynctask httpurlconnection

我正在尝试构建一个使用 OpenWeatherMap API 的应用程序。

我知道我无法从主线程发送 HTTP 请求。所以我改用 AsyncTask。

这是我运行 AsyncTask 的 MainActivity 类:

TextView txtView;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    txtView = (TextView)findViewById(R.id.myTextID);

    MyTask task = new MyTask(MainActivity.this, txtView);
    task.execute();

}

下面是 MyTask 类。这是我向 URL 发送 GET 请求并尝试获取响应代码的地方。

public class MyTask extends AsyncTask<String, String, String>{

    Context context;
    TextView txtView;
    MyTask (Context context, TextView txtView)
    {
        this.context = context;
        this.txtView = txtView;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... voids) {

        HttpURLConnection connection = null;
        BufferedReader reader;
        String line;
        StringBuffer responseContent = new StringBuffer();
        String x = "No response code";



        try {
            URL url = new URL("http://api.openweathermap.org/data/2.5/weather?q=london&appid=thisismyaccesstoken");

            connection = (HttpURLConnection) url.openConnection();

            connection.setRequestMethod("GET");
            connection.setReadTimeout(10000);
            connection.setConnectTimeout(10000);

            x = Integer.toString(connection.getResponseCode());

        }
        catch(Exception e)
        {
           //exception handling done here
        }

        return x;
    }

    @Override
    protected void onProgressUpdate(String... values) {
        super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(String s) {
        txtView.setText(s);
    }
}

我不想做任何花哨的加载栏的事情,所以我将 onProgressUpdate() 方法保留为空。

当我运行应用程序时,我在屏幕上看到“无响应代码”,只有当 MyTask 类无法将 GET 请求的响应代码保存到字符串 x 中时,该应用程序才会运行。

这是我第一次使用 AsyncTask。我是否做错了什么?

最佳答案

已修复。由于某种原因,每当我尝试将错误打印到控制台(在 catch block 中)时,我的应用程序就会崩溃。因此,我没有将异常打印到控制台,而是将异常转换为字符串并将该字符串保存在“x”中,如下所示:

catch(Exception e)
    {
       x = e.toString()
    }

这样整个异常就会显示在我的应用程序的 TextView 中。显然这是一个 SecurityException,因为我的应用程序没有访问互联网的权限。所以我只是在 AndroidManifest.xml 文件中添加了以下几行:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

这解决了问题。

关于java - 使用 AsyncTask 时无法从 HttpURLConnection.getResponseCode 接收值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57444916/

相关文章:

Android Room 库错误 : Cannot find setter for field. (Kotlin)

android - 如何在 Android 设备上查看 SQLite 数据库?

java - 是否调用 finish() ?

android - 带有 MySQL 数据的 AutoCompleteTextView

java - 为什么我不能动态更新 fragment 中的文本?

java - 用于在多个类中使用 sessionFactory 的 bean

android - 触摸屏幕时移动 View

java - 不向 Android 中的 AsyncTask 传递任何内容

java - 将 ArrayList 排序为对象类型,然后按字母顺序排序

java - 使用访问者模式的树转换