Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从asynctask调用活动的方法_Java_Android - Fatal编程技术网

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()的内容??