doInBackground不更新变量 [英] doInBackground not updating variable
问题描述
我正在使用一个基本的Android应用程序,该应用程序使用HttpURLConnection
生成一个POST
.我想从我的Web API返回响应消息.
I'm working on a basic android app that makes a POST
with HttpURLConnection
. I want to return the response Message from my Web API.
我的MainActivity.java
My MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView mTextView = findViewById(R.id.textView);
AsyncExample asyncExample = new AsyncExample();
asyncExample.execute();
mTextView.setText(asyncExample.getResponseMsg());
}
}
我的AsyncExample.java
My AsyncExample.java
class AsyncExample extends AsyncTask<Void, Void, Void> {
private HttpURLConnection con;
private String responseMsg;
protected void onPreExecute() {
responseMsg = "empty message";
}
@Override
protected Void doInBackground(Void... params) {
String urlParameters = "param1=data1";
byte[] postData = urlParameters.getBytes(Charset.forName("UTF-8"));
int postDataLength = postData.length;
String request = "http://192.168.1.30:6262";
URL url = null;
try {
url = new URL(request);
con = (HttpURLConnection) url.openConnection();
con.setDoOutput(true);
con.setInstanceFollowRedirects(false);
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
con.setRequestProperty("charset", "utf-8");
con.setRequestProperty("Content-Length", Integer.toString(postDataLength));
responseMsg = con.getResponseMessage();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public String getResponseMsg() {
return responseMsg;
}
}
运行该应用程序后,我在TextView
中得到了empty message
.为什么没有更新我的doInBackground
?即使con.getResponseMessage()
是null
,也应该对其进行更新吗?
After running the app, i get empty message
in my TextView
. Why it is not getting updated my doInBackground
? Even if con.getResponseMessage()
is null
, it should be updated?
推荐答案
问题是您的AsyncTask
是异步执行的,而您尝试立即检索该值.您需要以不同的方式实现此目标.要么利用AsyncTask的API,要么它在UI线程上为您发布回调.您可以直接在AsyncTask
The problem is that your AsyncTask
is executed asynchronously, while you try to retrieve the value immediately. You need to implement this a little bit differently. Either leverage the API of AsyncTask, sine it posts callbacks for your on the UI thread. You can update your TextView
directly in your AsyncTask
class MyAwesomeAsyncTask extends AsyncTask<Void, Void, String> {
@Override
protected void onPreExecute() {
myTextView.setText("progress started");
}
@Override
protected String doInBackground(final Void... voids) {
String s = amazingCallToBackend();
return s;
}
@Override
protected void onPostExecute(final String s) {
myTextView.setText(s);
}
}
或者,如果您只想要该值,则可以将回调传递给异步任务,该任务将为您提供该值
Or if you just want the value, you can pass a Callback to your async task that will deliver the value to you, something like that
interface Callback {
void onValueReceived(String value);
void onFailure();
}
class MyAwesomeAsyncTask extends AsyncTask<Void, Void, String> {
private Callback callback;
MyAwesomeAsyncTask(final Callback callback) {
this.callback = callback;
}
@Override
protected String doInBackground(final Void... voids) {
String s = amazingCallToBackend();
return s;
}
@Override
protected void onPostExecute(final String s) {
callback.onValueReceived(s);
}
}
这是您创建它的方式
Callback callback = new Callback() {
@Override
public void onValueReceived(final String value) {
}
@Override
public void onFailure() {
}
};
new MyAwesomeAsyncTask(callback).execute();
但是,要小心,因为如果由于某种原因您的活动/片段在完成AsyncTask之前已经消失/结束,则可能导致内存泄漏.
However, be careful because if for some reason your activity/fragment is gone/finished before your AsyncTask is done, this can cause memory leaks.
快速的Google搜索将告诉您所有有关AsyncTask泄漏内存的信息:)
A quick Google search will tell you all you want about AsyncTask leaking memory :)
这篇关于doInBackground不更新变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!