2016-10-03 83 views
0

我刚刚从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方法。我该如何解决这个问题?我不喜欢第一次尝试,因为它需要列出类中的所有方法,以便在调用它之前检查特定的方法。

回答

0

你的第二个例子几乎可以,除了你必须告诉它方法有哪些参数。

Class c=Class.forName("com.package.MainActivity"); 
Method m=c.getMethod("methodName", String.class, int.class, int.class, String.class); 
Object t = c.newInstance(); 
Object o= m.invoke(t,"string data", 0123, 123, "string data"); 

请记住,方法签名总是由:methodName +参数类型列表组成。如果你不告诉参数类型,它会寻找一个没有任何参数的方法。这就是为什么它会在第二个例子中抛出NoSuchMethod异常。作为一个方面说明,如果你的方法是静态的(就像在例子中那样),不要打扰类实例。您可以传递null作为m.invoke调用的第一个参数。请参阅方法javadoc:https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html#invoke-java.lang.Object-java.lang.Object...-

+0

嗨!我很亲密,你真的修复了令人困惑的部分。我想我只需要初始化这个部分的参数'm.invoke(t,“string data”,0123,123,“string data”);'。现在我知道了,无论如何我有一个错误:'不能创建处理程序内部线程没有调用Looper.prepare()',但我已经修复它。对于未来的研究人员,请您添加代码以解决该错误?我想帮助其他人这里的代码我有'活动活动=(活动)上下文; 活动。runOnUiThread(新的Runnable(){ \t @覆盖 \t公共无效的run(){ \t \t //调用方法 \t}} ' – lopi

+0

太谢谢你了! – lopi