gpt4 book ai didi

android - 从异步更新 UiThread 上的 TextView - Android

转载 作者:行者123 更新时间:2023-11-29 19:21:06 24 4
gpt4 key购买 nike

我正在使用 OkHttp3 执行 GET API 调用,该方法有效,但是我想使用 GET 调用的结果更新 UiThread 中的 TextView (jsonTextView)。

我尝试了 10 种不同的方法,但都不起作用。总是告诉我无法解决这个或那个,因此我请求如果您决定帮助我,请考虑发布对您的答案的任何依赖项,例如导入或声明。

我在休息课上留下了一行:“在 UITHREAD 中更新 jsonTextView 的代码”。您认为实现这一目标的最佳方法是什么?

提前非常感谢你,我已经为此浪费了几个小时。

这是我的 Activity

package it.test.test;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.EditText;

import android.os.*;

import android.util.Log;

public class MainActivity extends AppCompatActivity {

Button fetchUpdateButton;
TextView jsonTextView;
EditText assetCode;

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

fetchUpdateButton = (Button) findViewById(R.id.fetchUpdateButton);
fetchUpdateButton.setOnClickListener(fetchAssetUpdateClick);

jsonTextView = (TextView) findViewById(R.id.jsonTextView);
assetCode = (EditText) findViewById(R.id.assetCode);

}

View.OnClickListener fetchAssetUpdateClick = new View.OnClickListener() {
@Override
public void onClick(View v) {

REST r = new REST();

try {

r.getAssetUpdates(assetCode.getText().toString());

} catch (Exception e) {

e.printStackTrace();
jsonTextView.setText("API Fetch Failed");

}

}
};
}

这是我的 REST 类

package it.test.test;

import android.util.Log;

import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Headers;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;


/**
* Created by fabio on 25/02/2017.
*/

public class REST {

private final OkHttpClient client = new OkHttpClient();

public void getAssetUpdates(String assetCode) throws Exception {
Request request = new Request.Builder()
.url("http://10.0.0.3:8080/api/api/assets/getAsset?networkAssetCode=" + assetCode)
.build();

client.newCall(request).enqueue(new Callback() {
@Override public void onFailure(Call call, IOException e) {
e.printStackTrace();
}

@Override public void onResponse(Call call, Response response) throws IOException {
try (final ResponseBody responseBody = response.body()) {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

Headers responseHeaders = response.headers();
for (int i = 0, size = responseHeaders.size(); i < size; i++) {
System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
}

System.out.println(responseBody.string());

CODE TO UPDATE jsonTextView IN UITHREAD

}
}
});
}

}

最佳答案

除非将回调放入方法定义中,否则无法从 REST 类更新其他类 UI。

public void getAssetUpdates(String assetCode, Callback callback) {
...
client.newCall(request).enqueue(callback);
}

它只是围绕一些变量移动

然后,在 onClick 中定义您的回调,以便您可以访问该 Activity 类中的 TextView,

@Override
public void onClick(View v) {
...
r.getAssetUpdates(assetCode.getText().toString(),
new Callback() {
@Override public void onFailure(Call call, IOException e) {
e.printStackTrace();
}

@Override public void onResponse(Call call, Response response) throws IOException {
try (final ResponseBody responseBody = response.body()) {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

...

// update UI in here
}
}
);
}

而且我确实认为 Okhttp 需要使用 runOnUiThread。

OkHTTP Update UI from enqueue callback


请注意,如果您有 JSON 和 REST,那么 Retrofit 将比纯 Okhttp 更好。

关于android - 从异步更新 UiThread 上的 TextView - Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42459855/

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