Java 从asynctask调用活动的方法
我有两个类:Java 从asynctask调用活动的方法,java,android,Java,Android,我有两个类:Main-Activity和Second-AsyncTask。我想在点击按钮时触发mymethod 我试过了 public class Second extends AsyncTask<Void, Void, Void> { Main main; @Override protected void onProgressUpdate(Void... values) { // TODO Auto-generated method stub
Main-Activity
和Second-AsyncTask
。我想在点击按钮时触发mymethod
我试过了
public class Second extends AsyncTask<Void, Void, Void> {
Main main;
@Override
protected void onProgressUpdate(Void... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
main = new Main(); //Wrong because is an Activity
Button con = (Button)activity.findViewById(R.id.con);
con.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
main.mymethod(v);
}
});
}
}
公共类第二个任务{
主要的;
@凌驾
受保护的void onProgressUpdate(void…值){
//TODO自动生成的方法存根
super.onProgressUpdate(值);
main=new main();//错误,因为是活动
按钮con=(按钮)activity.findViewById(R.id.con);
con.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
主要方法(五);
}
});
}
}
但是它抛出
java.lang.IllegalStateException:onCreate()之前的活动无法使用系统服务看起来您从未将main
设置为实例,因此它是null
你需要像这样做
Main main = new Main();
事实上,由于您是从内部类引用main
,因此还需要将main
设置为final,以便内部类可以引用它:
final Main main = new Main();
您的asynctask类应该是Main的私有内部类。
通过这种方式,您将能够在第二时间从Main访问所需的所有内容
将主活动作为param传递给Second的解决方案是一个坏主意,因为Second仍然有一个对main的引用,而系统想要销毁main。如果确实需要调用mymethod(视图v),那么将其写入另一个单独的类中,最好是静态方法,它将帮助您在不使用类实例的情况下使用该方法。您可能无法使用所需的其他活动的方法,因为它是一个活动,因此必须在使用它之前运行onCreate。希望有帮助。使用new创建类Main?的对象。您不需要实例化Main
object,只需声明它即可。我不知道你是否有C++背景,但是在爪哇,你需要使用new new来创建一个实例。这可能是我的部分糟糕的单词选择,但是我编辑了它。是的,我知道这是我指出的。只是一个后续问题..是否允许使用变量名main?是的,您可以使用名为“main”的字段创建一个名为main的类,该类的main方法会隐藏名为main
的新变量,现在我得到:java.lang.IllegalStateException:onCreate()之前的活动无法使用系统服务。我忘了说二等任务。这是错误的!您不会像这样开始一个活动,而是这样做的:context.startActivity(newintent(context,Main.class));但这并不是解决问题的办法problem@Benoit在我给出答案的时候,这个问题与android编程无关。请查看问题的原始版本。看起来这将是唯一的解决方案。谢谢关于MyActivityClass.this.myMethod()的内容??