在并行运行Multiple Asynctasks时显示相同的值

时间:2013-11-22 12:57:14

标签: java android json multithreading android-asynctask

我正在使用3个Asynctasks并行尝试在线调用3个JSON api。

private static String url1 = "http://example.com:8080/firstJson";
private static String url2 = "http://example.com:8080/secondJson";
private static String url3 = "http://example.com:8080/thirdJson";

在我的mainActivity中,AsyncTask被假定为自我调用以来并行运行 我的AsyncTask类JSONParse,JSONParse1,JSONPArse2的executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)方法,因为我需要同时从3个不同的URL中检索3个变量的值。

但是,在所有三个TextView中都只设置了第三个url的值,其余值被覆盖,丢弃或忽略。

请指导我如何同时运行这三个API调用并显示正确的结果。

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

         Btngetdata = (Button)findViewById(R.id.getdata);
         Btngetdata.setOnClickListener(new View.OnClickListener() {
                    @Override
                public void onClick(View view) {
                    if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {
                        new JSONParse().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
                        Log.d(LOG_TAG,"JSONParse() ");
                        new JSONParse1().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
                        Log.d(LOG_TAG,"JSONParse1() ");
                        new JSONParse2().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
                        Log.d(LOG_TAG,"JSONParse1() ");
                    } else {
                        Log.d(LOG_TAG,"ELSE Inside thread");
                        new JSONParse().execute();
                    }

}}); }

我的AsyncTask类JSONParse如下:

   private class JSONParse extends AsyncTask<String, String, JSONObject> {
 @Override
  protected void onPreExecute() {
    super.onPreExecute();
    uid = (TextView)findViewById(R.id.uid);
}
 @Override
protected JSONObject doInBackground(String... args) {
   JSONParser jParser = new JSONParser();
   json1 = jParser.getJSONFromUrl(url1);

 return json1;
               }
 @Override
protected void onPostExecute(JSONObject json1) {

String jsonString = json1.getString("Sample");
 uid.setText(jsonString );
                        }  
  }

以及JSONParse1和JSONParse2。

我的AsyncTask类JSONParse如下:

   private class JSONParse1 extends AsyncTask<String, String, JSONObject> {
 @Override
  protected void onPreExecute() {
    super.onPreExecute();
    name= (TextView)findViewById(R.id.name);
}
 @Override
protected JSONObject doInBackground(String... args) {
   JSONParser jParser = new JSONParser();
   json2 = jParser.getJSONFromUrl(url3);

 return json2;
               }
 @Override
protected void onPostExecute(JSONObject json1) {
String jsonString = json2.getString("Sample");
 name.setText(jsonString );
                        }  
  }

这是我的JSONParse2

  private class JSONParse2 extends AsyncTask<String, String, JSONObject> {
     @Override
      protected void onPreExecute() {
        super.onPreExecute();
        value= (TextView)findViewById(R.id.value);
    }
     @Override
    protected JSONObject doInBackground(String... args) {
       JSONParser jParser = new JSONParser();
       json3 = jParser.getJSONFromUrl(url3);

     return json3;
                   }
     @Override
    protected void onPostExecute(JSONObject json3) {

    String jsonString = json3.getString("Sample");
     value.setText(jsonString );
     }}

2 个答案:

答案 0 :(得分:0)

因为您将所有textview id都视为相同。拿不同的身份然后尝试.. android:id =“@ + id / uid”...尝试为所有textViews更改它

答案 1 :(得分:0)

在所有三个班级JSONParseJSONParse1JSONParse2中,您发现TextView来自(TextView)findViewById(R.id.uid);其次您正在使用value变量所有三个类都在你的mainActivity类中明确声明,因为它没有在3个类中任何一个声明。