非静态方法execute()无法从静态上下文引用

4

我不理解为什么会出现编译错误;这里涉及的类或方法都不是静态的。也许有人可以在这里提供一些帮助。

在我的MainActivity类中,我声明了一个公共类,它继承自AsyncTask:

public class AsyncStuff extends AsyncTask<String, Void, String> {
    ...
}

在我的非活动类中,我有一个公共函数应该触发异步任务:
public class Util {
    public void ExecuteAsyncMethod(){
        MainActivity.AsyncStuff.execute(new String[]{"test" }); // error here
    }
}

我也尝试过实例化MainActivity.AsyncStuff类的对象并执行它的execute()方法,但由于它不在封闭类中,所以这也行不通。我不能将它移动到其他地方,因为我需要更新UI,所以它必须留在MainActivity类中。
无论如何,我需要帮助弄清楚为什么我的ExecuteAsyncMethod()方法无法编译。
谢谢!

我猜你需要外部类的实例(MainActivity实例,通过this实现),以创建内部类实例MainActivity.this.new AsyncStuff().execute(new String[]{"test" }); - devcodes
可能是重复的问题:"非静态方法无法从静态上下文中引用"错误 - Solomon Slow
2个回答

7

定义如下:

public static class AsyncStuff extends AsyncTask<String, Void, String> {
    ...
}

并且运行如下:

public class Util {
    public void ExecuteAsyncMethod(){
        new AsyncStuff().execute(new String[]{"test" });
    }
}

如果我这样做,我无法在我的onPostExecute()中引用非静态变量。有什么解决办法吗? - Taslim Oseni
要引用非静态变量,请使用正常的Java习惯用语:将它们传递到ExecuteAsyncMethod()中,然后传递到AsyncStuff()构造函数中,并将它们存储在成员变量中。然后就可以在onPostExecute()中访问这些值了。 - Theo Lassonder
我最终解决了我的问题。我在某个地方犯了一个愚蠢的语义错误。这个方法可行。谢谢。 - Taslim Oseni

5
你出现该错误的原因是你需要实例化你的AsyncTask,你试图调用execute()方法,就好像它是一个静态方法一样。
至于你是否可以移动你的AsyncTask,是的,你可以,只需将类设置为静态(或完全作为自己的类),并且对活动进行弱引用,这样在AsyncTask完成之前,不会保留在RAM中。不管你是否将其保留在你的MainActivity中,这都是你想要做的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接