gpt4 book ai didi

java - ArrayAdapter 帮助,使用从方法返回的字符串数组填充

转载 作者:行者123 更新时间:2023-11-29 19:34:20 25 4
gpt4 key购买 nike

我正在努力学习 Head First Android Development,但遇到了问题。我正在尝试使用以下代码并使用从另一个类中的方法返回的数组填充 ListView ,但我收到错误并且不明白为什么。如果我尝试调用新 ArrayAdapter 中的方法,它似乎只会给我错误,就像这样....

public class ListBikeStands extends ListActivity{

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

ListView listStands = getListView();
ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(
this,
android.R.layout.simple_list_item_1,
BikesStands.getStandName());
listStands.setAdapter(listAdapter);
}

它调用的类/方法如下...

public class BikeStands {

private static OkHttpClient client = new OkHttpClient();
private static final String key = "key";
private static final String contract = "contract";


public static String getJSON(String url) throws IOException {
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
return response.body().string();
}


private static String[] getStandName() {
String json = null;

try {
json = getJSON("https://api.jcdecaux.com/vls/v1/stations?contract=" + contract + "&apiKey=" + key);
} catch (IOException e) {
e.printStackTrace();
}

Gson gson = new Gson();

DBikesStation[] bikesAPI = gson.fromJson(json, DBikesStation[].class);
String[] bikeStands = new String[bikesAPI.length];

for (int i = 0; i < bikesAPI.length; ++i) {
bikeStands[i] = bikesAPI[i].getName();
}
;
return bikeStands;
}

我收到以下错误...

java.lang.RuntimeException: Unable to start activity ComponentInfo{package......dublinbikes.ListBikeStands}: android.os.NetworkOnMainThreadException

我确实将 ListBikeStands 作为 AndroidManifest.xml 中的一个 Activity 。

非常感谢任何帮助。谢谢。

最佳答案

您对 OkHTTPClient 的使用不太正确。您在 UI 线程上发出了同步请求,因此是您的错误。

public static String getJSON(String url) throws IOException {
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
return response.body().string();
}

为了发出异步请求,在后台,尝试这样的事情。传入一个 Callback 并使用 enqueue

重要说明:如果您认为在异步方法中需要 return,那通常是不正确的。看到我将方法更改为 void 类型。回调是如何返回变量。

public static void getJSON(String url, Callback callback) throws IOException {
Request request = new Request.Builder().url(url).build();
client.newCall(request).enqueue(callback);
}

要调用它,请定义回调 - 此处显示为变量,但也可以内联到方法调用中,例如 View.OnClickListner 用于按钮。

您应该在 Activity 类中定义它,因为您将更新适配器。

final Callback bikeStandCallback = new Callback() {
@Override public void onFailure(Call call, IOException e) {
e.printStackTrace();
}

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

String body = response.body().string();

Gson gson = new Gson();

DBikesStation[] bikesAPI = gson.fromJson(body, DBikesStation[].class);

for (int i = 0; i < bikesAPI.length; ++i) {
adapter.add(bikesAPI[i].getName());
}
}
};

并在需要时将其传递。

public class ListBikeStands extends ListActivity {

private ListView listStands;
private ArrayAdapter<String> listAdapter;

// TODO: Define above bikeStandCallback here

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

listStands = getListView();
ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(
this,
android.R.layout.simple_list_item_1);
listStands.setAdapter(listAdapter);

// TODO: Get url value
BikeStands.getJSON(url, bikeStandCallback);
}
}

而且,在我看来,这是非常灵活的,因为您可以为各种数据定义多个回调,使用不同的参数再次调用 BikeStands.getJSON,然后用它做任何您想做的事要求。

总的来说,这有点像Retrofit可以,除了可以为您添加 Gson 转换器。

关于java - ArrayAdapter 帮助,使用从方法返回的字符串数组填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39430544/

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