使用runOnUiThread更改Android中的TextView文本

时间:2018-05-23 07:29:43

标签: android android-asynctask android-runonuithread

我有一个应用程序在用户登录时进行API调用,我有两个类,一个推送到API,另一个推送它。我的LogIn Activity上还有一个 asyncTask 来处理网络连接。当网络连接开始时,我有一个视图switcher来将视图切换到进度加载器和textview,textview用于显示诸如" Connecting",&#34之类的内容;下载数据"等。

问题是我的API推送和拉取方法存储在不同的类中,而LogIn AsyncTask 只是调用它们,除了更新TextView之外,它都有效用户知道进度。

在LogIn活动中,我有这个方法,它将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;
        }
    } 

如果我从LogIn Activity中的 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");
            }
        });
    }

这就是我想出来的,但它似乎没什么打击,我甚至都看不到Log post。

我在执行此操作时也遇到了错误,但是当我将 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 :(得分:1)

您无法直接访问资源中的string,您必须先获取resources才能使用其内容。您需要从getResources()拨打Activity,然后就可以获得您要找的string

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

覆盖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 } } }; 。< / p>

<强>活动:

TextView
  

注意:将您的loadInfo {{1}}设为静态