Страница 1 из 1

Обновление содержимого активити

Добавлено: 31 май 2014, 22:27
Vanya_1234
Здравствуйте! В андроид-програмировании я новичок. Пытался связать MySQL и Android парсингом JSON на примере статьи в нете. По ходу разработки наткнулся на проблему: обновление содержимого активити по заданому времени и при переходе от другого активити. Помогите пожалуйста!
Вообщем на с сайта заносим данные в БД. Api запускает на исполнение скрипт и читает ответ.
Использовал AsyncTask.
Класс All_mess отображает списки всех сообщений(ListView), которые сформировал php.
После выбора сообщения открывается активити Text_mess для написания ответа. Нужно периодичесски обновлять All_mess + после закрытия Text_mess.

Код: Выделить всё

public class All_mess extends ListActivity {

    private ProgressDialog pDialog;
    String etlogin = null;

    JSONParser jParser = new JSONParser();

    ArrayList<HashMap<String, String>> messagesList;

    private static String url_all_mess = "http://server/mess.php";

    // JSON Node names
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_MESSAGE = "messages";
    private static final String TAG_MESS_ID = "message_id";
    private static final String TAG_COUNT_ALL_MESS = "count_all";
    private static final String TAG_LOGIN_BOSS = "login_boss";

    // тут будет хранится список продуктов
    JSONArray messages = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_all_mess);

        // Hashmap for ListView
        messagesList = new ArrayList<HashMap<String, String>>();
        etlogin = getIntent().getStringExtra("login");

        // Загружаем продукты в фоновом потоке
        new LoadAllMess().execute();

        // получаем ListView
        ListView lv = getListView();

        // на выбор одного продукта
        // запускается Edit Product Screen
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                // getting values from selected ListItem
                String pid = ((TextView) view.findViewById(R.id.pid)).getText()
                        .toString();
                String login = ((TextView) view.findViewById(R.id.name)).getText()
                        .toString();

                // Запускаем новый intent который покажет нам Activity
                Intent in = new Intent(getApplicationContext(), Text_mess.class);
                // отправляем pid в следующий activity
                in.putExtra(TAG_MESS_ID, pid);
                in.putExtra(TAG_LOGIN_BOSS,login);
                Log.d(TAG_MESS_ID, pid);

                // запуская новый Activity ожидаем ответ обратно
                startActivityForResult(in, 100);
            }
        });

    }


    // Ответ из Edit Product Activity
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // если результующий код равен 100
        if (resultCode == 100) {
            // если полученный код результата равен 100
            // значит пользователь редактирует или удалил продукт
            // тогда мы перезагружаем этот экран
            Intent intent = getIntent();
            finish();
            startActivity(intent);
        }

    }

    public void showAlert(final String Title, final String Mess){
        All_mess.this.runOnUiThread(new Runnable() {
            public void run() {
                AlertDialog.Builder builder = new AlertDialog.Builder(All_mess.this);
                builder.setTitle(Title);
                builder.setMessage(Mess)
                        .setCancelable(false)
                        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                            }
                        });
                AlertDialog alert = builder.create();
                alert.show();
            }
        });
    }

    /**
     * Фоновый Async Task для загрузки всех продуктов по HTTP запросу
     * */
    class LoadAllMess extends AsyncTask<String, String, String> {

        /**
         * Перед началом фонового потока Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(All_mess.this);
            pDialog.setMessage("Загрузка повідомлень. Зачекайте...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        /**
         * Получаем все продукт из url
         * */
        protected String doInBackground(String... args) {
            // Будет хранить параметры
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("username",etlogin));
            // получаем JSON строк с URL
            JSONObject json = jParser.makeHttpRequest(url_all_mess, "POST", params);

            Log.d("All Messages: ", json.toString());

            try {
                // Получаем SUCCESS тег для проверки статуса ответа сервера
                int success = json.getInt(TAG_SUCCESS);
                int count_mess = json.getInt(TAG_COUNT_ALL_MESS);

                if (success == 1) {
                    if(count_mess == 0){
                        showAlert("Немає повідомлень!", "Для вашого акаунта немає нових повідомлень!");

                    }else {
                        // продукт найден
                        // Получаем масив из Продуктов
                        messages = json.getJSONArray(TAG_MESSAGE);

                        // перебор всех продуктов
                        for (int i = 0; i < messages.length(); i++) {
                            JSONObject c = messages.getJSONObject(i);

                            // Сохраняем каждый json елемент в переменную
                            String id = c.getString(TAG_MESS_ID);
                            String name = c.getString(TAG_LOGIN_BOSS);

                            // Создаем новый HashMap
                            HashMap<String, String> map = new HashMap<String, String>();

                            // добавляем каждый елемент в HashMap ключ => значение
                            map.put(TAG_MESS_ID, id);
                            map.put(TAG_LOGIN_BOSS, name);
                            Log.d(TAG_MESS_ID,id);
                            Log.d(TAG_LOGIN_BOSS,name);

                            // добавляем HashList в ArrayList
                            messagesList.add(map);
                        }
                    }
                } else {
                            showAlert("Помилка!", "Виникла помилка на сервері!");
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }

        /**
         * После завершения фоновой задачи закрываем прогрес диалог
         * **/
        protected void onPostExecute(String file_url) {
            // закрываем прогресс диалог после получение все продуктов
            pDialog.dismiss();
            // обновляем UI форму в фоновом потоке
            runOnUiThread(new Runnable() {
                public void run() {
                    /**
                     * Обновляем распарсенные JSON данные в ListView
                     * */
                    ListAdapter adapter = new SimpleAdapter(
                            All_mess.this, messagesList,
                            R.layout.list_item, new String[] { TAG_MESS_ID,
                            TAG_LOGIN_BOSS},
                            new int[] { R.id.pid, R.id.name });
                    // обновляем listview
                    setListAdapter(adapter);
                }
            });

        }

    }
}

Код: Выделить всё

public class Text_mess extends Activity {

    public String getParam_report() {
        return Param_report;
    }

    public void setParam_report(String param_report) {
        Param_report = param_report;
    }

    public String getParam_id() {
        return Param_id;
    }

    public void setParam_id(String param_id) {
        Param_id = param_id;
    }

    String Param_id;
    String Param_report;

    String login;
    String id;
    TextView tv1;
    TextView tvquest;
    TextView tvdate;
    EditText txtansw;
    Button yes;
    Button no;
    JSONParser jParser = new JSONParser();

    private static final String TAG_SUCCESS = "success";
    private static final String TAG_MESSAGE = "messages";
    private static final String TAG_MESS_ID = "message_id";
    private static final String TAG_LOGIN_BOSS = "login_boss";
    private static final String TAG_POSTED_TIME = "posted_time";
    private static final String TAG_TEXT = "text";

    private ProgressDialog pDialog;

    JSONParser jsonParser = new JSONParser();
    private static String url_one_mess = "http://server/mess_one.php";
    private static String url_add_mess = "http://server/add_mess.php";
  
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_text_mess);
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);


        id = getIntent().getStringExtra(TAG_MESS_ID);
        login = getIntent().getStringExtra(TAG_LOGIN_BOSS);

        // отримання повідомлень в фоновому потоці
        new GetMess().execute();


        setParam_id(id);
        txtansw = (EditText)  findViewById(R.id.txtansw);

        yes = (Button) findViewById(R.id.btn1);
        no = (Button) findViewById(R.id.btn0);

        // обробник кнопки yes
        yes.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {

                setParam_report("1");
                Log.d("report", getParam_report());

                new CreateNewMess().execute();
            }
        });

        // обробник кнопки no
        no.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                setParam_report("0");
                Log.d("report", getParam_report());
                new CreateNewMess().execute();

            }
        });

    }

    /**
     * Фонова асинхронна задача
     **/
    class GetMess extends AsyncTask<String, String, String> {

        /**
         * Прогресдіалог
         **/
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(Text_mess.this);
            pDialog.setMessage("Загрузка повідомлення.Зачекайте будь-ласка...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        /**
         * Фоновий режим
         **/
        protected String doInBackground(String[] params) {

            // обновляє UI
            runOnUiThread(new Runnable() {
                public void run() {
                    // провіряє статус success
                    int success;
                    try {
                        // Список параметрів
                        Log.d("id", id);
                        List<NameValuePair> params = new ArrayList<NameValuePair>();
                        params.add(new BasicNameValuePair("id", id));
                        // отримує JSON рядки з URL

                        JSONObject json = jParser.makeHttpRequest(url_one_mess, "POST", params);
                        Log.d("Single Product Details", json.toString());

                        success = json.getInt(TAG_SUCCESS);

                        if (success == 1) {
                            // успіх
                            JSONArray productObj = json.getJSONArray(TAG_MESSAGE);

                            // отримуєм перший обєкт з JSON Array
                            JSONObject product = productObj.getJSONObject(0);

                            // повідомлення знайдено
                            //
                            tvquest = (TextView) findViewById(R.id.tvquest);
                            tv1 = (TextView) findViewById(R.id.tvlogin);
                            tvdate = (TextView) findViewById(R.id.tvdate);
                            txtansw = (EditText) findViewById(R.id.txtansw);

                            //
                            Log.d(TAG_TEXT, product.getString(TAG_TEXT));
                            Log.d(TAG_POSTED_TIME, product.getString(TAG_POSTED_TIME));
                            tv1.setText(login);
                            tvquest.setText(product.getString(TAG_TEXT));
                            tvdate.setText(product.getString(TAG_POSTED_TIME));

                        }

                        else{
                            Log.d("TEST","Повідомлення не знайдено!");
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });

            return null;
        }

        /**
         * Закриває прогрес діалог
         **/
        protected void onPostExecute(String file_url) {
            //
            pDialog.dismiss();
        }
    }

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

        public List<NameValuePair> params = new ArrayList<NameValuePair>();
        /**
         * Показує загрузку
         **/
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(Text_mess.this);
            pDialog.setMessage("Відправка повідомлення ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        /**
         * відправка відповіді
         **/
        protected String doInBackground(String... args) {


            // формує параметри
            txtansw = (EditText) findViewById(R.id.txtansw);
            String annsw = txtansw.getText().toString();
            params.add(new BasicNameValuePair("text_answer", annsw));
            params.add(new BasicNameValuePair("message_id",getParam_id()));
            params.add(new BasicNameValuePair("report",getParam_report()));


            // отримує JSON обєкт
            JSONObject json = jsonParser.makeHttpRequest(url_add_mess, "POST", params);

            // Log.d("Create Response", json.toString());
            Log.d("answer", annsw);

            try {
                int success = json.getInt(TAG_SUCCESS);

                if (success == 1) {
                    // відповідь відправлена
                    runOnUiThread(new Runnable() {
                        public void run() {
                            Toast.makeText(Text_mess.this, "Повідомлення відправлено", Toast.LENGTH_SHORT).show();
                        }
                    });
                    //Intent i = new Intent(getApplicationContext(), All_mess.class);

                    //????????????     startActivity(i); //перезагрузка содержимого активити .
                    finish();
                } else {

                    Text_mess.this.runOnUiThread(new Runnable() {
                        public void run() {
                            AlertDialog.Builder builder = new AlertDialog.Builder(Text_mess.this);
                            builder.setTitle("Виникла помилка!");
                            builder.setMessage("Повідомлення не було відправлено.")
                                    .setCancelable(false)
                                    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog, int id) {
                                        }
                                    });
                            AlertDialog alert = builder.create();
                            alert.show();
                        }
                    });
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }


        protected void onPostExecute(String file_url) {
            pDialog.dismiss();
        }

    }

}
Заранее спасибо!!!