我刚刚从link了解了调用方法,现在我正在尝试使用它,但无法使其与我想要的逻辑一起工作。 我只是想从一个线程调用一个方法。线程内调用方法
我已经使用了下面的代码,它的工作。但是这里的问题是循环,循环必须列出类的所有方法,并检查特定的方法是否存在,然后调用它。
Class myclass = Class.forName("com.package.MainActivity");
Method[] methods = myclass.getMethods();
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().equals("methodName")) {
Log.w(TAG, "Method Found!");
methods[i].invoke("methodName", "string data", 0123, 123, "string data");
}
}
我想简化下面的代码,但它一直告诉我该方法没有找到。 ERROR: java.lang.NoSuchMethodException: methodName []
Class c=Class.forName("com.package.MainActivity");
Method m=c.getMethod("methodName");
Object t = c.newInstance();
Object o= m.invoke(t,"string data", 0123, 123, "string data");
我也尝试了下面的代码,但它也没有工作,错误说:Can't create handler inside thread that has not called Looper.prepare()
Object carObj = Class.forName("com.package.MainActivity").newInstance();
Method method = carObj.getClass().getMethod("methodName");
method.invoke(method, "string data", 0123, 123, "string data");
我做的所有上面的代码与下面:
主方法应该呼叫的类别
public class MainActivity extends AppCompatActivity {
static MyHelper myHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnStart = (Button)findViewById(R.id.btnStart);
myHelper = new MyHelper(this);
myHelper.StartThread();
}
/*The Method to Invoke*/
public static void methodName(String data1, int var1, int var2, String data2){
//some code here...
}
}
帮助器类启动线程,包括我的一些功能
public class MyHelper{
private Context context;
public MyHelper(Context context){
this.context = context;
}
public static void StartThread(){
TheThread theThread = new TheThread(context);
Thread t = new Thread(theThread);
t.start();
}
//Some code below
}
线程其中,该方法应该是调用
public class TheThread implements Runnable{
private Context context;
public TheThread(Context context){
this.context = context;
}
@Override
public void run(){
try{
String className = context.getClass().getName(); //The Class Name including its package.
//First Attempt
/*Class myclass = Class.forName(className);
Method[] methods = myclass.getMethods();
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().equals("methodName")) {
Log.w(TAG, "Method Found!");
methods[i].invoke("methodName", "string data", 0123, 123, "string data");
}
} */
//Second Attempt
/*Class c=Class.forName(className);
Method m=c.getMethod("methodName");
Object t = c.newInstance();
Object o= m.invoke(t,"string data", 0123, 123, "string data");*/
//Third attempt
/*Object carObj = Class.forName(className).newInstance();
Method method = carObj.getClass().getMethod("methodName");
method.invoke(method, "string data", 0123, 123, "string data"); */
}catch(Exception e){
Log.e("Invoke Error","Unable to invoke method => " + e.toString());
}
}
}
我目前的股票,完全混淆invoke方法。我该如何解决这个问题?我不喜欢第一次尝试,因为它需要列出类中的所有方法,以便在调用它之前检查特定的方法。
嗨!我很亲密,你真的修复了令人困惑的部分。我想我只需要初始化这个部分的参数'm.invoke(t,“string data”,0123,123,“string data”);'。现在我知道了,无论如何我有一个错误:'不能创建处理程序内部线程没有调用Looper.prepare()',但我已经修复它。对于未来的研究人员,请您添加代码以解决该错误?我想帮助其他人这里的代码我有'活动活动=(活动)上下文; 活动。runOnUiThread(新的Runnable(){ \t @覆盖 \t公共无效的run(){ \t \t //调用方法 \t}} ' – lopi
太谢谢你了! – lopi