Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayAdapter帮助,使用从方法返回的字符串数组填充_Java_Android_Android Arrayadapter - Fatal编程技术网

Java 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) {

我正在努力完成Head First Android开发,我遇到了一个问题。我试图使用下面的代码并使用从另一个类中的方法返回的数组填充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类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数据,因此可能会重复,我建议您花点时间了解改造