如何在 Android 中使用来自相同 class 但不同方法的变量?

How can I use a variable from the same class but different method in Android?

我最近选择了 Java,我正在尝试在 Android Studio 中制作一个可以访问 API 的简单应用程序。我正在尝试使用 HttpURLConnection,但我在使用 类 时遇到问题,当我尝试将两者组合 类 时出现错误,如果没有两者似乎无法正常工作。

我的目标是让名为 TextView1 的 TextView 能够更改为显示来自以下代码的代码。

http.getResponseCode() + " " + http.getResponseMessage()

代码

package com.example.myapplication;

import android.os.Bundle;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import java.net.*;

public class MainActivity extends AppCompatActivity {

    public void main(String[] args) throws Exception {

        // Sending get request
        setContentView(R.layout.activity_main);

        URL url = new URL("https://reqbin.com/echo/get/json");
        HttpURLConnection http = (HttpURLConnection) url.openConnection();
        http.setRequestProperty("Content-Type", "application/json");
        http.setRequestProperty("Accept", "application/json");

        String responsecode = http.getResponseCode() + " " + http.getResponseMessage();
        http.disconnect();
    }

    public void onCreate(Bundle savedInstanceState) {

        // Sending get request
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView textView = (TextView)findViewById(R.id.TextView1);
        String string = "Hello";
        textView.setText(string);
    }
}

首先,据我所知,Android没有使用“main”方法。

对于 API 个电话,您可能有更好的选择:

  • 使用一个框架(像最常用的 Retrofit)
  • 使用 Thread 并通过 运行OnUIThread
  • 方法更新您的 UI
  • 使用 AsyncTask(已弃用)
  • 或者其他方式

我的观点是你不能 运行 显然 UI 线程上的 API 调用:试图加载你的线程 Activity。据我所知,Android 正在通过一个明确的例外来防止这种情况发生。

因此,您可以做的是在您的 onCreate 方法上调用一个新的线程,您在那里调用 HttpCall,您得到响应(例如在一个字符串上),然后通过 运行OnUIThread() 方法。 进入 运行OnUIThread,如果你做了这样的事情,你可以直接调用你的 textView :

TextView textView;
public void onCreate(Bundle savedInstanceState) {

    // Sending get request
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    textView = (TextView)findViewById(R.id.TextView1);
    new Thread(); // you create your thread here
} 

在您的线程中,您可以阅读流(感谢@Pablo Lanza 指出这一点)或直接从线程中读取:

String responsecode = http.getResponseCode() + " " + http.getResponseMessage();

然后在 运行OnUI 线程上,您可以:

textView.setText(responsecode);

所以你可以得到类似下面的代码:

TextView textView;
public void onCreate(Bundle savedInstanceState) {

    // Sending get request
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    textView = (TextView)findViewById(R.id.TextView1);
    new Thread(new Runnable() {
        @Override
        public void run() {
            URL url = new URL("https://reqbin.com/echo/get/json");
            HttpURLConnection http = (HttpURLConnection) url.openConnection();
            http.setRequestProperty("Content-Type", "application/json");
            http.setRequestProperty("Accept", "application/json");

            String responsecode = http.getResponseCode() + " " + http.getResponseMessage();
            http.disconnect();
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    textView.setText(responsecode);
                }
            });
        }
    }).run();
}

可能是因为您没有阅读流,所以您的代码无法正常工作。

在阅读回复之前尝试这几行:

InputStream is=URLConnection.getInputStream();
while(is.read>=0);