【问题标题】:Same value displayed on running Multiple Asynctasks in parallel并行运行多个异步任务时显示的值相同
【发布时间】:2013-11-22 12:57:14
【问题描述】:

我正在尝试使用 3 个异步任务并行调用 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 );
     }}

【问题讨论】:

    标签: java android json multithreading android-asynctask


    【解决方案1】:

    因为你把所有的 textview id 都一样了。取不同的id然后尝试.. android:id="@+id/uid"...尝试为所有textViews更改它

    【讨论】:

    • 我也面临同样的问题..但现在 ii 只需更改 id 即可解决....
    【解决方案2】:

    JSONParseJSONParse1JSONParse2 这三个类中,您可以从(TextView)findViewById(R.id.uid); 中找到TextView 其次,您在所有三个类中都使用了value 变量,这肯定在您的mainActivity 中声明类,因为它没有在 3 个类中的任何一个中声明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-03
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-08
      • 2020-07-24
      • 1970-01-01
      相关资源
      最近更新 更多