关于java:如何从Android中的Web API方法访问返回的值?

How do I access the returned value from a Web API Method in Android?

在对如何这样做感到困惑之后(可以在这里和这里看到,我现在已经成功地连接到我的服务器应用程序和适当的RESTful方法,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public void onFetchBtnClicked(View v){
    if(v.getId() == R.id.FetchBtn){
        Toast.makeText(getApplicationContext(),"You mashed the button, dude.", Toast.LENGTH_SHORT).show();
    new CallAPI().execute("http://10.0.2.2:28642/api/Departments/GetCount?serialNum=4242");
    }
}

public static class CallAPI extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... params) {

        String urlString=params[0]; // URL to call
        String resultToDisplay ="";
        InputStream in = null;

        // HTTP Get
        try {
            URL url = new URL(urlString);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            in = new BufferedInputStream(urlConnection.getInputStream());
        } catch (Exception e ) {
            System.out.println(e.getMessage());
            return e.getMessage();
        }
        return resultToDisplay;

    }

    protected void onPostExecute(String result) {
        Log.i("FromOnPostExecute", result);
    }

} // end CallAPI

我意识到我需要将一些东西(初始化时的空字符串除外)分配给ResultToDisplay,但是什么呢?我需要"in"的什么部分来访问/隐藏字符串?

更新

"手动"的方法对我来说很有效,但是狂热的ApacheIO实用程序"没有那么多"(嗯,它编译了…)。这是我的代码:

1
2
3
4
5
6
try {
    URL url = new URL(urlString);
    HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
    in = new BufferedInputStream(urlConnection.getInputStream());
    resultToDisplay = getStringFromInputStream(in);
    total = IOUtils.toString(in);

结果显示任务工作(我得到"18")。道达尔的作业没有(我得到"")。

注意:"getStringFromInputStream()"方法来自Raghunandan的链接。

更新2

这很好用(使用willjbd的想法使用ApacheCommons的ioutils):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
new CallWebAPI().execute("http://10.0.2.2:28642/api/Departments/GetCount?serialNum=4242");
. . .
private class CallWebAPI extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... params) {

        String urlString=params[0]; // URL to call
        String result ="";

        // HTTP Get
        try {
            URL url = new URL(urlString);
            HttpURLConnection urlConnection =  
                (HttpURLConnection)url.openConnection();
            InputStream inputStream = urlConnection.getInputStream();
            if (null != inputStream)
                result= IOUtils.toString(inputStream);
        } catch (Exception e ) {
            System.out.println(e.getMessage());
            return e.getMessage();
        }
        return result;
    }

    @Override
    protected void onPostExecute(String result) {
        Log.i("RenameTheWashingtonFootballTeamTheRedskinPeanuts", result);
    }
}

…因此很明显,没有必要将"compile files('libs/commons-io-2.4.jar')"之类的内容添加到build.gradle的dependencies部分,根据这一点,至少一次是必要的。如果有人能验证这样一个[m,pp]的结尾来构建.gradle已经不再需要了,我会是gradleful。

更新4

我只是注意到我无意中从onPostExecute()方法中删除了"@override",但是没有它就没什么区别了——没有它就可以正常工作,一旦我恢复它,它就可以正常工作。那么拥有它有什么好处呢?它只是多余的绒毛吗?


为什么不使用像ioutils这样的东西?

1
2
3
InputStream inputStream = urlConnection.getInputStream();
if (inputStream != null)
    String content = IOUtils.toString(inputStream);

http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/ioutils.html

现在,您可以使用许多库中的一个将字符串解析为JSON或XML。