Использование runOnUiThread для изменения текста TextView в Android - PullRequest
0 голосов
/ 23 мая 2018

У меня есть приложение, которое выполняет вызовы API, когда пользователь входит в систему, у меня есть два класса, один из которых передает API-интерфейс, а другой - извлекает из него.У меня также есть asyncTask в моей активности входа в систему, которая обрабатывает сетевое соединение.Когда начинается сетевое соединение, у меня есть представление switcher, чтобы переключить представление на загрузчик прогресса, и textview, текстовое представление используется для отображения таких вещей, как «Подключение», «Загрузка данных» и т. Д.

Проблема в том, что мои методы API Push и Pull хранятся в разных классах, и LogIn AsyncTask просто вызывает их, все работает, за исключением обновления TextView, чтобы позволить пользователюзнать прогресс.

В операции входа в систему у меня есть этот метод, который изменяет информацию textview на любой номер, который ему передается.

public void updateProgress(int i) {
        switch (i) {
            case 0:
                loadInfo.setText(R.string.log_in_thread_Connecting);
                break;
            case 1:
                loadInfo.setText(R.string.log_in_thread_Connected);
                break;
            case 2:
                loadInfo.setText(R.string.log_in_Thread_Sending_Data);
                break;
            case 3:
                loadInfo.setText(R.string.log_in_thread_Response);
                break;
            case 4:
                loadInfo.setText(R.string.log_in_web_connecting);
                break;
            case 5:
                loadInfo.setText(R.string.log_in_web_connected);
                break;
            case 6:
                loadInfo.setText(R.string.log_in_web_user_data_download);
                break;
            case 7:
                loadInfo.setText(R.string.log_in_web_user_data_downloaded);
                break;
            case 8:
                loadInfo.setText(R.string.log_in_web_device_data_upload);
                break;
        }
    } 

Это работает, если я вызываю его изAsyncTask из входа в систему, но не из классов API.

Я нашел метод с именем .runOnUiThread, поэтому я попытался реализовать это.

private void publishProgress(final int i){
        logInActivity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                   logInActivity.updateProgress(i);
                Log.d("UI THREAD","HIT");
            }
        });
    }

Это то, что я придумал, но, похоже, ничего не происходит, я даже не вижу запись в журнале.

У меня также была ошибка при реализации этого, но она была устранена, когда я добавил Looper.prepare(); в логин AsyncTask

AsyncTask

private class RegistrationWeb extends AsyncTask<Void,Void,Void>{
        private static final String tag = "API_LogIn";
        private String APIKey = null

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            viewFlipper.showNext();
            APIKey = getAPIKey();
        }

        @Override
        protected Void doInBackground(Void... voids) {
            try{
                Looper.prepare();
                GetAPIData get = new GetAPIData();
                URL url = new URL(API_Register_User+APIKey);

                String response = get.GetData(url);

                JSONArray jsonArray = new JSONArray(response);
                JSONObject jsonObject = jsonArray.getJSONObject(0);

                //If the user is accepted
                if(jsonObject.getString("_Code").equals("0")){

                    PublishProgress(8);

                    PostAPIData post = new PostAPIData();
                    url = new URL(API_Register_Device);

                    response = post.PostData(url);

                    jsonArray = new JSONArray(response);
                    jsonObject = jsonArray.getJSONObject(0);

                } else if(jsonObject.getString("_Code").equals("2")){

                }

            } catch (MalformedURLException e) {
                Log.e(tag,e.toString());
            } catch (JSONException e) {
                Log.e(tag,e.toString());
            } catch (IOException e) {
                Log.e(tag,e.toString());
            }
            return null;
        }

        private void PublishProgress(final int i){
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    updateProgress(i);
                }
            });
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
        }
    }

1 Ответ

0 голосов
/ 23 мая 2018

Вы не можете напрямую получить доступ к string, присутствующему в ресурсе , вам необходимо сначала получить resources, чтобы использовать его содержимое.Вам нужно позвонить getResources() с вашего Activity, затем вы можете получить string, который вы ищете.

YourActivity.context.getResources().getString(R.string.id_name);

Override onProgressUpdate(), а затем позвонить publishProgress()

    public void publishProgress(Integer v) {
       Message message = new Message();
       message.what = v;
       YourActivity.handler.sendMessage(message);
    }

   @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        publishProgress(values[0);
    }

И измените свой параметр AsyncTask во время его создания с Void на Integer

class RegistrationWeb extends AsyncTask<Integer,Integer,Integer> {

}

В вашем Activity, где находится TextView, для которого вы хотите обновить, сделайте Handlerпрослушивать сообщения из внешнего класса и в этом обработчике обновлять вашу TextView.

активность:

public static Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        switch (msg.what) {
            //update your text view on the basis of msg.what
        }
    }
};

Примечание. Сделайте свой TextViewloadInfo как статический

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...