成功doinbackground调用时禁用Android禁用按钮

时间:2013-02-04 10:13:02

标签: android asynchronous fatal-error

以下代码在v1.setEnabled(false)行上提供了致命异常异步任务#2。

这意味着在成功通话时禁用按钮。后台任务之前的v.setEnabled(false);工作正常。请帮忙:(

public void onClick(View v) {
    Intent intent = new Intent(DISPLAY_MESSAGE_ACTION);
    //this one would work
    //v.setEnabled(false);

    final View v1=v;
    mRegisterTask1 = new AsyncTask<Void, Void, Void>() {

    @Override
    protected Void doInBackground(Void... params) {
        boolean success = 
            ServerUtilities.receipt (((String)v1.getTag()).substring(3),"acknowledged");

        if (success) {
            //this one causes Async Task exception
            v1.setEnabled(false);
        } 
        else {
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        mRegisterTask1 = null;
    }

3 个答案:

答案 0 :(得分:5)

您无法从后台线程更改UI状态 AsyncTask onPreExecute()&amp;主线程中调用的onPostExecute()个方法 看看:

public void onClick(View v) {
    Intent intent = new Intent(DISPLAY_MESSAGE_ACTION);
    //this one would work
    //v.setEnabled(false);


    final View v1=v;
    mRegisterTask1 = new AsyncTask<Void, Void, Boolean>() {

        @Override
        protected Boolean doInBackground(Void... params) {
            boolean success =
                    ServerUtilities.receipt (((String)v1.getTag()).substring(3),"acknowledged");


            return success;
        }

        @Override
        protected void onPostExecute(Bolean result) {

        if (result) {
                //this one causes Async Task exception
                v1.setEnabled(false);
            } else {

            }

            mRegisterTask1 = null;
        }
    }
}

答案 1 :(得分:0)

将ui修改移至onPostExecute

boolean success = false;

protected Void doInBackground(Void... params) {
      success = ServerUtilities.receipt (((String)v1.getTag()).substring(3),"acknowledged");

        if (success) {
               //this one causes Async Task exception
                 v1.setEnabled(false);
          } else {

           }
                    return null;
             }
@Override
 protected void onPostExecute(Void result) {
      if (success) {
         //this one causes Async Task exception
            v1.setEnabled(false);
        } else {

        }
       mRegisterTask1 = null;
  }

答案 2 :(得分:0)

您需要从UI线程更改小部件。方法onProgressUpdateOnPostExecute在UI therad中执行。因此,您可以考虑将代码移至后者。