Java ArrayAdapter帮助,使用从方法返回的字符串数组填充
我正在努力完成Head First Android开发,我遇到了一个问题。我试图使用下面的代码并使用从另一个类中的方法返回的数组填充listview,但是我得到了错误,不明白为什么。如果我尝试在新的ArrayAdapter中调用该方法,它似乎只会给我错误,就像这样Java ArrayAdapter帮助,使用从方法返回的字符串数组填充,java,android,android-arrayadapter,Java,Android,Android Arrayadapter,我正在努力完成Head First Android开发,我遇到了一个问题。我试图使用下面的代码并使用从另一个类中的方法返回的数组填充listview,但是我得到了错误,不明白为什么。如果我尝试在新的ArrayAdapter中调用该方法,它似乎只会给我错误,就像这样 public class ListBikeStands extends ListActivity{ @Override protected void onCreate(Bundle savedInstanceState) {
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类ListBikeStands扩展ListActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
ListView listStands=getListView();
ArrayAdapter listAdapter=新的ArrayAdapter(
这
android.R.layout.simple\u list\u item\u 1,
getStandName());
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;
}
public class BikeStands{
私有静态OkHttpClient=new OkHttpClient();
私有静态最终字符串key=“key”;
私有静态最终字符串contract=“contract”;
公共静态字符串getJSON(字符串url)引发IOException{
Request Request=newrequest.Builder().url(url.build();
Response=client.newCall(request.execute();
返回响应.body().string();
}
私有静态字符串[]getStandName(){
字符串json=null;
试一试{
json=getJSON(“https://api.jcdecaux.com/vls/v1/stations?contract=“+contract+”&apiKey=“+key”);
}捕获(IOE异常){
e、 printStackTrace();
}
Gson Gson=新的Gson();
DBikesStation[]bikesAPI=gson.fromJson(json,DBikesStation[].class);
String[]bikeStands=新字符串[bikesAPI.length];
对于(int i=0;i
我得到以下错误
java.lang.RuntimeException:无法启动活动
ComponentInfo{package……dublinbikes.ListBikeStands}:
android.os.NetworkOnMainThreadException
我在AndroidManifest.xml中将ListBikeStands作为活动
非常感谢您的帮助。谢谢。您正在主线程中设置适配器。在适配器中,您正在调用方法“getJSON()”,该方法进行一些网络连接。但是,不允许您在主线程上进行网络连接。您需要在单独的线程中获取JSON-为此使用Asynctask(在“doInBackground”中获取JSON)(),然后在“onPostExecute()”)中设置适配器您收到的错误不是在填充适配器时抛出的,而是因为您试图在主线程上执行网络操作 您必须在不同的线程上执行网络操作,您可以使用,您可以在
禁止在主线程上联网,因为它通常是异步的,且资源密集型的,因此可能会生成ANR(应用程序无响应)您对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();
}
要在后台发出异步请求,请尝试类似的操作。传入回调
并使用排队
重要提示:如果您认为在异步方法中需要返回
,这通常是不正确的。请参阅我将该方法更改为无效
类型。回调是如何返回
变量
public static void getJSON(String url, Callback callback) throws IOException {
Request request = new Request.Builder().url(url).build();
client.newCall(request).enqueue(callback);
}
要调用它,请定义回调-此处显示为一个变量,但也可以像视图一样排列在方法调用中。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());
}
}
};
final Callback bikeStandCallback=new Callback(){
@覆盖公共void onFailure(调用,IOE异常){
e、 printStackTrace();
}
@重写公共void onResponse(调用调用、响应响应)引发IOException{
如果(!response.issusccessful())抛出新IOException(“意外代码”+响应);
String body=response.body().String();
Gson Gson=新的Gson();
DBikesStation[]bikesAPI=gson.fromJson(body,DBikesStation[].class);
对于(int i=0;i
当你需要的时候把它传过来
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);
}
}
public类ListBikeStands扩展ListActivity{
私人ListView listStands;
专用阵列适配器列表适配器;
//TODO:在此处定义上述bikeStandCallback
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
listStands=getListView();
ArrayAdapter listAdapter=新的ArrayAdapter(
这
android.R.layout.simple\u list\u item\u 1);
setAdapter(listAdapter);
//TODO:获取url值
getJSON(url,bikeStandCallback);
}
}
在我看来,这是非常灵活的,因为您可以为各种数据定义多个回调,再次使用不同的参数调用BikeStands.getJSON
,然后对该请求执行任何操作
总的来说,除了可以为您添加Gson转换器之外,这在某种程度上是可以做到的。阅读错误日志,您将了解您在主线程上执行网络操作。因此,您应该检查您的getJson(url)方法。使用asynctask获取ur数据。也就是说,在getJson方法中实现asynctask。由于您请求的是JSON数据,因此可能会重复,我建议您花点时间了解改造