1

这是我见过的最奇怪的问题。尽管我的数据库中有产品,但我得到“没有可用的产品”。

这是我的服务:

public class AllProductsService {

private String URL = "xxxx";

Gson gson;

public AllProductsService(int page) {
    gson = new Gson();
    URL = URL + "?page=" + Integer.toString(page);
}

private InputStream sendRequest(URL url) throws Exception {

    try {
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

        urlConnection.connect();

        if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
            return urlConnection.getInputStream();
        }
    } catch (Exception e) {
        throw new Exception("");
    }

    return null;
}

public List<Product> getProducts() {

    try {

        InputStream inputStream = sendRequest(new URL(URL));


        if(inputStream != null) {

            InputStreamReader reader = new InputStreamReader(inputStream);

            return gson.fromJson(reader, new TypeToken<List<Product>>(){}.getType());
        }

    } 
    catch (Exception e) {

    }
    return null;
}
}

还有我的 AsyncTask 类:

private class AllProductsTask extends AsyncTask<Void, Void, List<Product>> {

    @Override
    protected void onPreExecute() {
        setSupportProgressBarIndeterminateVisibility(true);
    }

    @Override
    protected List<Product> doInBackground(Void... params) {

        AllProductsService allProductsService = new AllProductsService(current_page);
        List<Product> liste = allProductsService.getProducts();

        if (liste != null && liste.size() >= 1)
            return liste;

        return new ArrayList<Product>();
    }

    protected void onPostExecute(java.util.List<Product> result) {

        setSupportProgressBarIndeterminateVisibility(false);

        if (result.isEmpty() && isInternetPresent && current_page < 2) {
            Crouton.makeText(MainActivity.this, "No product available!", Style.ALERT).show();
        }

        //populate adapter
    }   
}

当我从浏览器调用 URL 时,结果会正确显示。我也尝试使用具有相同代码的不同 URL,它工作正常。我不知道为什么。

4

2 回答 2

1

我认为问题是;你要退回

new ArrayList<Product>();

在为空的 Asynctask 的 doInBackground() 中。您应该在此处返回列表。或放置return new ArrayList<Product>();在 else 条件

于 2013-07-27T00:37:02.453 回答
0

我找到了解决方案:只需删除 URL 末尾的斜杠即可。谢谢@trevor-e。了解 HTTP 代码状态对我有帮助。

于 2013-07-27T00:50:40.957 回答