当前位置: 首页 > 面试题库 >

如何通过asyncTask方法从2个不同的URL解析数据

骆文华
2023-03-14
问题内容

我有一个从JSON URL获取数据的应用程序。它与一个URL完美搭配,但是我需要同时从两个JSON
URL中获取数据。就像来自一个URL的一些数据和来自另一个URL的一些数据一样。并在两个textViews中显示它们。

这是我的应用程序,它当前不加载任何数据。

主要活动:

public class MainActivity extends Activity {

//URL to get JSON Array
private static String url1 = "http://api.worldbank.org/countries/de?format=json";
private static String url2 = "http://api.worldbank.org/countries/it?format=json";

//JSON Node Names 
private static final String CountryNAME1 = "name";
private static final String CountryNAME2 = "name";
JSONArray user = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    new GetJSONTask().execute(url1);
    //new GETJSONTask().execute(url2);
}
class GetJSONTask extends AsyncTask<String, Void, JSONObject> {


    protected JSONObject doInBackground(String... urls) {
        // Creating new JSON Parser
        JSONParser jParser = new JSONParser();

        // Getting JSON from URL
        JSONObject json1 = jParser.getJSONFromUrl(url1);
        JSONObject json2 = jParser.getJSONFromUrl(url2);

        return json1;
    }
    protected void onPostExecute(JSONObject json1, JSONObject json2) {
        //Getting JSON Array
        try {

            //For Country 1
            // Get the array
            JSONArray countryArC1 = json1.getJSONArray("myValues");
            JSONObject countryObC1 = countryArC1.getJSONObject(0);

            JSONArray countryAr2C1 = countryArC1.getJSONArray(1);
            JSONObject countryOb2C1 = countryAr2C1.getJSONObject(0);

            //For Country 2
         // Get the array
            JSONArray countryArC2 = json2.getJSONArray("myValues");
            JSONObject countryObC2 = countryArC2.getJSONObject(0);

            JSONArray countryAr2C2 = countryArC2.getJSONArray(1);
            JSONObject countryOb2C2 = countryAr2C2.getJSONObject(0);




            //Storing JSON item in a Variable
            String name1 = countryOb2C1.getString(CountryNAME1);
            String name2 = countryOb2C2.getString(CountryNAME2);

            //Importing TextView
            final TextView textView1 = (TextView)findViewById(R.id.url1);
            final TextView textView2 = (TextView)findViewById(R.id.url2);

            //Set JSON Data in TextView
            textView1.setText(name1);
            textView2.setText(name2);

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

JSONParser:

public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

// constructor
public JSONParser() {

}

public JSONObject getJSONFromUrl(String url) {

    //System.out.println("url getJSONfromUrl " + url);
    //url = "http://api.worldbank.org/countries/CA/indicators/SP.POP.TOTL?date=1980:1981&format=json";

    // Making HTTP request
    try {
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(url);

        HttpResponse httpResponse = httpClient.execute(httpGet);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        json = sb.toString();
        System.out.println("JSONParser string: " + json);
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        jObj = new JSONObject(json);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }


    if (json.startsWith("[")) {
        // We have a JSONArray
        try {
            jObj = new JSONObject();
            jObj.put("data", new JSONArray(json));
        } catch (JSONException e) {
            Log.d("JSON Parser", "Error parsing JSONArray " + e.toString());
        }
        return jObj;
    }

 // try parse the string to a JSON object
    /*try {
        jObj = new JSONObject(json);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }*/

    // return JSON String
    return jObj;



}
}

XML:

 <TextView
        android:id="@+id/url1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
         />

    <TextView
        android:id="@+id/url2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/url1"
        android:layout_marginTop="104dp"
         />

我认为主要的问题是new GetJSONTask().execute(url1);JSONObject json1 = jParser.getJSONFromUrl(url1);因为我不能有2个GetJSONTASK,也不能同时返回json1和json2。

任何想法 ?


问题答案:

我建议您将方法更改为

class GetJSONTask extends AsyncTask<String, Void, JSONObject[]> {

 ...

 protected JSONObject[] doInBackground(String... urls) {
    // Creating new JSON Parser
    JSONParser jParser = new JSONParser();

    // Getting JSON from URL
    JSONObject[] jsons = new JSONObject[2];
    jsons[0] = jParser.getJSONFromUrl(url1);
    jsons[1] = jParser.getJSONFromUrl(url2);

    return jsons;
}
protected void onPostExecute(JSONObject[] jsons) {
    JSONObject json1 = jsons[0];
    JSONObject json2 = jsons[1];
    // do you work after this
}
}

希望对您有所帮助!



 类似资料:
  • 问题内容: 我有一个像这样的数据URL: 将其作为二进制数据(例如a )获取以便将其写入文件的最简单方法是什么? 问题答案: 使用“ base64”编码将数据放入缓冲区,然后将其写入文件:

  • 我在解析JSON中的数据时遇到了以下问题 这些节点是在我使用Firebase时生成的。push()方法。是否有方法获取所有节点并访问信息。我正在使用java并在google app engine上开发一个项目。

  • 问题内容: 我正在尝试从服务器解析JSON响应,如果在post方法中发送的查询中有更改,我将第一个作为响应,否则,我将第二个作为响应。 1: 2: 如您所见,返回对象是否更改,如果没有更改,则返回字符串。 我正在使用这种方法来获取数据,并且我正在使用Gson Converter来映射数据。 这是请求界面 这是我的POJO课 最后我进行了改造电话: 问题答案: 谢谢您的建议,但我想出了一种可行的方法

  • 我不能用空手道提供从json文件到Rest URL的数据。我的特征文件结构如下;请帮帮忙。 方案大纲:获取响应 路径=“https://myurl/account/#(data1)/PhoneNo/#(data2)/SomeOperationName'” 方法获取时 则状态为成功 在这种情况下,我得到无效的帐户和无效的phoneno错误,这意味着URL没有从json文件中获取数据。

  • 问题内容: 当我在一个类文件中使用代码时,它可以完美运行: 我想从其他类文件运行我的异步任务,我有代码: 下载File.java 下载FileAsync.java 我正在使用eclipse,并且我的DownloadFile.java文件中出现错误,有很多带红色下划线的代码…。我是java和android dev的新手。 问题答案: 如果可以通过某种方式将Activity类或其上下文传递给Async

  • 这不是一个重复的问题,请不要标记为重复。这个Json可以用GSON库解析吗?