Java 从AsyncTask类调用主类的非静态方法
我需要从AsyncTask调用一个非静态方法 必须在onPostExecute中调用此方法 我使用了:Java 从AsyncTask类调用主类的非静态方法,java,android,Java,Android,我需要从AsyncTask调用一个非静态方法 必须在onPostExecute中调用此方法 我使用了: Main.mymethod(); 但它说: Cannot make a static reference to the non-static method mymethod() from the type Main 如何解决这个问题 谢谢 编辑:我尝试过: protected void onPostExecute(String result) { new Main
Main.mymethod();
但它说:
Cannot make a static reference to the non-static method mymethod() from the type Main
如何解决这个问题
谢谢
编辑:我尝试过:
protected void onPostExecute(String result) {
new Main().mymethod();
}
抛出:
07-09 01:43:15.248: E/AndroidRuntime(29945): FATAL EXCEPTION: main
07-09 01:43:15.248: E/AndroidRuntime(29945): java.lang.NullPointerException
07-09 01:43:15.248: E/AndroidRuntime(29945): at android.app.Activity.findViewById(Activity.java:1794)
07-09 01:43:15.248: E/AndroidRuntime(29945): at android.os.AsyncTask.finish(AsyncTask.java:602)
07-09 01:43:15.248: E/AndroidRuntime(29945): at android.os.AsyncTask.access$600(AsyncTask.java:156)
07-09 01:43:15.248: E/AndroidRuntime(29945): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
07-09 01:43:15.248: E/AndroidRuntime(29945): at android.os.Handler.dispatchMessage(Handler.java:99)
07-09 01:43:15.248: E/AndroidRuntime(29945): at android.os.Looper.loop(Looper.java:137)
07-09 01:43:15.248: E/AndroidRuntime(29945): at android.app.ActivityThread.main(ActivityThread.java:4575)
07-09 01:43:15.248: E/AndroidRuntime(29945): at java.lang.reflect.Method.invokeNative(Native Method)
07-09 01:43:15.248: E/AndroidRuntime(29945): at java.lang.reflect.Method.invoke(Method.java:511)
07-09 01:43:15.248: E/AndroidRuntime(29945): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
07-09 01:43:15.248: E/AndroidRuntime(29945): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
07-09 01:43:15.248: E/AndroidRuntime(29945): at dalvik.system.NativeStart.main(Native Method)
如果已在调用的类中定义了方法,请执行以下操作:
myMethod();
而不是:
Main.myMethod();
通过将类放在方法前面(Main.myMethod()
),可以像调用静态方法一样调用该方法。记住,要调用静态方法,您需要执行以下操作:ClassName.yourStaticMethod()
下面是一个如何使用AsyncTask
并使用我给您的答案在类中调用方法的示例:
package com.example.async;
import android.R;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
String something;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_item);
myTask mt = new myTask();
something = ", something old.";
mt.execute(something);
}
public String myMethod(String something){
Log.d("My Log", "This is something " + something);
return something;
}
public class myTask extends AsyncTask<Object, Object, Object> {
@Override
protected Object doInBackground(Object... arg0) {
// TODO Auto-generated method stub
myMethod(something);
return something;
}
@Override
protected void onPostExecute(Object result){
something = ", something new.";
myMethod(something);
}
}
}
package com.example.async;
导入android.R;
导入android.app.Activity;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.util.Log;
公共类MainActivity扩展了活动{
串东西;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u list\u项);
myTask mt=新的myTask();
一些东西,一些旧的东西;
执行(某物);
}
公共字符串myMethod(字符串){
Log.d(“我的日志”,“这是某物”+某物);
归还某物;
}
公共类myTask扩展了AsyncTask{
@凌驾
受保护对象doInBackground(对象…arg0){
//TODO自动生成的方法存根
我的方法(某物);
归还某物;
}
@凌驾
受保护的void onPostExecute(对象结果){
something=“,something new.”;
我的方法(某物);
}
}
}
以下是在设备上运行时的结果,显示我的方法已执行:
07-08 18:13:17.900: D/My Log(23241): This is something , something old.
07-08 18:13:17.940: D/memalloc(23241): /dev/pmem: Mapped buffer base:0x5106c000 size:1536000 offset:0 fd:52
07-08 18:13:17.960: D/My Log(23241): This is something , something new.
07-08 18:13:17.980: E/Adreno200-ES20(23241): <qgl2DrvAPI_glUseProgram:1318>: **** 23241: glUseProgram(3)
07-08 18:13:18.010: E/Adreno200-ES20(23241): <qgl2DrvAPI_glUseProgram:1318>: **** 23241: glUseProgram(6)
07-08 18:13:18.020: D/memalloc(23241): /dev/pmem: Mapped buffer base:0x512e3000 size:4812800 offset:3276800 fd:55
07-0818:13:17.900:D/我的日志(23241):这是一些东西,一些古老的东西。
07-08 18:13:17.940:D/memalloc(23241):/dev/pmem:Mapped buffer base:0x5106c000 size:1536000 offset:0 fd:52
2007-08 18:13:17.960:D/我的日志(23241):这是新的东西。
07-08 18:13:17.980:E/Adreno200-ES20(23241):*****23241:glUseProgram(3)
07-08 18:13:18.010:E/Adreno200-ES20(23241):*****23241:glUseProgram(6)
07-08 18:13:18.020:D/memalloc(23241):/dev/pmem:Mapped buffer base:0x512e3000 size:4812800 offset:3276800 fd:55
如果没有更多的代码,很难给出很多示例,但是您需要发送对AsyncTask
类的引用,假设它是一个单独的类,并使用该引用调用该方法
MyTask myTask = new MyTask(this);
然后在异步任务中
class MyTask extends AsyncTask
{
MyActivity mActivity;
public MyTask(Activity act)
{
mActivity = (MyActivity) act;
...
mActivity . method(); // add this wherever you want to call it
}
如果我使用newmain().mymethod(),请检查问题(基本相同的问题)代码>它抛出NullPointerException@user222请发布错误消息您是否尝试过按我建议的方式调用它?您能否将代码发布到您调用它的类中,以便我们更好地了解您正在做/尝试做什么。
mymethod(); call this method simply
mymethod(); you can also pass parameters to it if you have defined parameterized method like mymethod(someObj, someVariable);