gpt4 book ai didi

android - 使用 AsyncTask 实现 API 并将结果更新到 UI

转载 作者:行者123 更新时间:2023-11-29 01:54:46 25 4
gpt4 key购买 nike

我在 API 中使用 AsyncTask 来执行网络操作。在 UI 部分有一个按钮,点击它会触发 API 来执行请求/异步任务。 API 正在实现从 onPostExecute() 方法更新的回调。一旦 onPostExecute() 将数据传递给回调,API 就会获得填充的正确数据。这一切都很好。但是我在更新到 UI 时遇到了一些概念性问题。这就是我想要实现的目标:1-点击用户界面上的“按钮”2- 我想将 API 的响应字符串更新到 UI。这是我在执行 AsyncTask 后得到的响应字符串。

问题是 API 在当前执行线程中总是返回 null 作为响应。一旦 UI 线程完成,我就会看到 API/AsyncTask 数据进来。我知道我遗漏了一些非常微不足道但很重要的东西。您知道在 UI 上更新 API 响应的正确方法是什么吗?

[更新]

这是我的 UI 代码,其中包括单击按钮通过 API 触发异步任务(只是另一个实现回调以获取服务器响应的类)

button.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
API api = new API();
Request request = new Request();
request.setUrl("http://www.example.com/");
api.fetch(request);

try {
//It doesn't matter how much you wait here to return the response.
//Response from task doesn't return in this thread.
//If I click another button say "refresh" to refresh the data, then api.getResponseString() shows the response from server.
Thread.sleep(2000);
//api.getResponseString() returns null. I expect it to return data just retrieved from server
String text = api.getResponseString();
System.out.println("Text: " + text);
textView.setText(text);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});

API 代码

public class Api implements ResponseCallbacks {

String responseString = null;

public void fetch(Request request) {
makeRequest(request, this);
}

public void makeRequest(Request request,
final ResponseCallbacks responseCallbacks) {
MyTask asyncTask = new MyTask();
asyncTask.setResponseCallbacks(responseCallbacks);
asyncTask.execute(request);
}

@Override
public void onSuccess(Response response) throws IOException {
if (response.isSuccess()) {
responseString = "Success";
} else {
responseString = "Failed";
}
}

public String getResponseString() {
return responseString;
}
}

AsyncTask代码

public class MyTask extends AsyncTask {
private ResponseCallbacks responseCallbacks;

public MyTask() {}

public void setResponseCallbacks(ResponseCallbacks callbacks) {
this.responseCallbacks = callbacks;
}

@Override
protected Response doInBackground(Request... params) {
Request request = params[0];
Response Response = null;

try {
//Make Http call and gets response from remote server here...
} catch (Exception e) {

}

return response;
}

protected void onPostExecute(Response response) {
if (response.isSuccess()) {
try {
if (response.isSuccess()) {
callbacks.onSuccess(response);
}
} catch (Exception e) {
callbacks.onFailure(response);
}
}
}


}

我想要的是在单击按钮后在 textView 中更新从服务器返回的文本。

[更新 2]显然,我发现如果我再定义一个回调 UICallback 并让我的 Activity 注册到它,问题就解决了。

UICallback:

public interface UICallback {
public void onFailure(String response);
void onSuccess(String response) throws IOException;
}

让 Activity 实现它:

public class MainActivity extends Activity implements UICallback {
.......
api = new NetApi();
api.setUICallbacks(this);
.......

@Override
public void onSuccess(String response) throws IOException {
String text = api.getResponseString();
//works !
textView.setText(text);

}
}

有没有人有比这更好的解决方案?我真的不喜欢 Activity 实现额外回调的想法。如果我的 api 本身可以在完成获取数据后仅通过 api.getResponseString() 传递服务器响应,那就太棒了。

最佳答案

我的猜测是,您要查找的实际上是 runOnUIThread .

如果您在 onPostExecute 中使用它,您可以刷新您的 UI 数据而无需注册回调等。像这样:

protected void onPostExecute(Response response) {
if (response.isSuccess()) {
try {
if (response.isSuccess()) {

runOnUiThread(new Runnable() {
public void run() {
textView.setText(text);

}
});
}
} catch (Exception e) {
callbacks.onFailure(response);
}
}
}

同步替代方案是在主线程中使用 Runnable。您必须重新定义 MyTask 才能立即实现 Runnablejoin。像这样

Thread asyncTask = new Thread(MyTask());
asyncTask.start();
asyncTask.join();//gets called as soon as the task ends

我的任务是

public class MyTask implements Runnable{

public void run(){
//do whatever you need to do
}
}

关于android - 使用 AsyncTask 实现 API 并将结果更新到 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15824597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com