Asynctask中的Toast未正确显示

时间:2013-12-05 03:20:07

标签: android toast

Toast显示了大约2次,而Json正在返回精美的6个物体。

如果它的问题是RunOnUiThread(我知道它不适合在asyntask中使用)或者其他问题,请

我可以使用其他方式为我的变量“mensaje”每次放入一个字符串,我可以显示Toat,也许在OnPostExecute中。

class asyncMensaje extends AsyncTask<String, String, String> {

        @Override
        protected String doInBackground(String... params) {
            String user = params[0];
            ArrayList<NameValuePair> envioDato = new ArrayList<NameValuePair>();
            envioDato.add(new BasicNameValuePair("rut", user));
            JSONArray jdata2 = post.getserverdata(envioDato, URL_connectFechas);

                if (jdata2 != null && jdata2.length() > 0) {
                JSONObject json_data; // creamos un objeto JSON
                for (int i = 0; i < jdata2.length(); i++) { 
                    try {   
                    json_data = jdata2.getJSONObject(i);
                    mensaje = json_data.getString("mensaje");
                    Log.e("Info: ", "" + mensaje);
                    } catch (JSONException e) {

                        e.printStackTrace();
            }
                 runOnUiThread(new Runnable() {

                        public void run() {

                          Toast.makeText(getApplicationContext(), mensaje, Toast.LENGTH_LONG).show();

                           }
                        });


              }
            }


            return null;
        }

        protected void onPostExecute(String result) {



        }

    }

2 个答案:

答案 0 :(得分:1)

在您的情况下,理想的解决方案是将onProgressUpdateToast的排序结合使用。执行后者请参考this answer

class asyncMensaje extends AsyncTask<String, String, String> {

        @Override
        protected String doInBackground(String... params) {
            //....
            for (int i = 0; i < jdata2.length(); i++) {
              //..
              publishProgress(mensaje);
            }
        }
        @Override
        protected void onProgressUpdate(String... progress) {
            //code for showing Toast
        }
}

答案 1 :(得分:0)

使用onPostExecute方法从doInBackground中的webservice获取数据,而不是在不同Thread上运行的doInBackground中使用runOnUiThread。这样做:

 @Override
        protected String doInBackground(String... params) {
            String user = params[0];
            ArrayList<NameValuePair> envioDato = new ArrayList<NameValuePair>();
            envioDato.add(new BasicNameValuePair("rut", user));
            JSONArray jdata2 = post.getserverdata(envioDato, URL_connectFechas);
            return jdata2.toString();
        }
   @Override
     protected void onPostExecute(String result) {
        JSONArray jdata2=new JSONArray(result);
         // parse JSONArray here and show Toast...

      }