【问题标题】:Enabling Buttons after doInBackground finishesdoInBackground 完成后启用按钮
【发布时间】:2012-12-28 10:25:51
【问题描述】:

doInBackground() 的内容完成后,我想从我的主要活动中启用几个按钮!有人可以告诉我该怎么做吗?

我不能使用findViewByID() 使按钮在AsyncTask 类中可见,因为它不是activity 类! :/

【问题讨论】:

  • 为什么不直接将活动的引用传递给 AsyncTask?
  • @Adil Soomro 对不起,这对我来说有点太复杂了!你能描述一下它以适应我的场景吗?

标签: java android android-asynctask


【解决方案1】:

这样做...

  • 定义启用按钮的方法。
  • 然后在PostExecute()AsyncTask,调用该方法

【讨论】:

  • 所以我必须在 MainActivity.java 中定义方法并从 AsyncTask PostEXecute() 中调用它?
  • yes.. 使按钮全局化,以便您可以在活动中的任何位置获取它。
  • 它不起作用,我需要将视图传递给启用 MainActivity 按钮的方法,对吗?但是这个方法是从 AsyncTask 类中调用的,我该怎么做呢?
  • 您不必将视图传递给Asynctask 即可启用它。只需调用onPostExecute() 上的方法即可。在方法中,启用按钮。一切都...
  • 检查这个:pastie.org/private/n9zyelt5zsumjl0et464q 这给了我一个错误,使应用程序强制关闭。错误日志:pastie.org/5588296
【解决方案2】:

AsynTask 类的 onPostExecution(...) { } 有一个回调,使用此方法处理 UI 内容,启用、禁用按钮只需在 onPostExcustion(...) 中这样写

runOnUiThread(new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub

    }
});

还要确保此方法仅在活动类中可用

谢谢

【讨论】:

    【解决方案3】:

    按照这条路:

    [1] 创建您的 AsyncTask:

    public class performBackgroundTask extends AsyncTask<Void, Void, Void> {
        ProgressDialog Dialog = new ProgressDialog(HotUsers.this);
        protected void onPreExecute() {
            Dialog.setMessage("Loading Hot Users..."); 
            Dialog.show();      
        }
    
        protected void onPostExecute(Void unused) {
            if(Dialog.isShowing()) 
                Dialog.dismiss();
            set_details_on_screen();
    
        }
    
        @Override
        protected Void doInBackground(Void... params) {         
            get_details_from_server(); // get data like userid,username,userdesc etc...
            return null;
        }
    }
    

    [2]这将调用函数来进行 UI 更改。

    public void set_details_on_screen()
     {
        if(userid > 0 )
            handler_default.sendEmptyMessage(0);
        else
                handler_default.sendEmptyMessage(1);
    
     }
    

    [3]最后,您的 UI 更改将通过此处理程序反映在屏幕上。

    private Handler handler_default = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case 0: {
                textuserid = (TextView) findViewById(R.id.userid);
                textusername = (TextView) findViewById(R.id.username);
                textuserdesc = (TextView) findViewById(R.id.userdesc);
    
                textuserid.setText(userid);
                textusername.setText(username);
                textuserdesc.setText(userdesc);
    
                break;
            }
            case 1: {
                Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show();
                break;
            }
    
           }
        }
    };
    

    谢谢。

    【讨论】:

      【解决方案4】:

      您的类扩展了 AsyncTask,您可以在调用 execute() 时将上下文推送到其中。

      private class RegisterUser extends AsyncTask<String,String,String> {
      
          private ListActivity activity;
          public RegisterUser(ListActivity activity) {
              this.activity = activity;
          }
      
          protected void onPostExecute(JSONObject json) {
              activity.editText = (EditText)activity.findViewById(R.id.editText1);
              //or
              activity.enableButton();
          }
      }
      

      并像这样从 Activity 调用执行:

      new RegisterUser(this).execute(new String[] {"param"});
      

      或者您可以在 Activity 类中定义 AsyncTask 类 - 您可以在其中访问所有内容。 更多信息Lars Vogel - Android Threads, Handlers and AsyncTask

      【讨论】:

        猜你喜欢
        • 2013-05-01
        • 2022-07-19
        • 2011-08-10
        • 2012-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多