2012-12-28 77 views
-1

一旦doInBackground()的东西完成,我想从我的主要活动中启用几个按钮!有人可以让我知道如何做到这一点?doInBackground完成后启用按钮

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

+0

你为什么不把你的活动的参考传递给你的AsyncTask? – asgoth

+2

[这样做](http://stackoverflow.com/a/7618705/593709) –

+0

@Adil Soomro我很抱歉,这对我来说太复杂了!你能否描述它以适应我的情况? – defiant

回答

5

难道就像这个...

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

所以我必须在MainActivity.java中定义方法并从AsyncTask PostEXecute()中调用它? – defiant

+4

是的。使按钮全局化,以便您可以在活动中的任何位置获取它。 – Renjith

+0

它不工作,我需要将视图传递给启用MainActivity权限按钮的方法?但是这个方法是从AsyncTask类中调用的,那么我该怎么做呢? – defiant

0

存在的AsynTask类使用一个回调onPostExecution(...){}这个方法来UI的东西,用于启用,禁用按钮只写这种方式onPostExcustion(...)

runOnUiThread(new Runnable() { 

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

    } 
}); 

也确保这种方法只在活动课提供

谢谢

0

当你调用execute()方法时,你的类扩展了AsyncTask,你可以将你的上下文放入它中。

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(); 
    } 
} 

,并调用从活动像这样执行:

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

,或者你可以定义你的Activity类里面的AsyncTask类 - 在这里你可以达到的一切。 更多信息Lars Vogel - Android Threads, Handlers and AsyncTask

0

按照这样:

[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],将调用函数继续进行用户界面的变化。

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

} 

[3]最后你的用户界面的变化会在屏幕上与该Handler反映。

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; 
     } 

     } 
    } 
}; 

谢谢。

相关问题