如何在 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);
我最近选择了 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);