在单独的类中调用方法

时间:2011-10-01 14:48:37

标签: android multithreading

我有我的主类设置和工作线程,我在run()中提出的一个早期请求是调用我的第二个名为login的类。我是这样做的:

    login cLogin = new login();
    cLogin.myLogin();

类登录如下所示:

package timer.test;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.widget.Toast;

public class login extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // setContentView(R.layout.main);
    }

    public void myLogin() {
        // prepare the alert box
        AlertDialog.Builder alertbox = new AlertDialog.Builder(this);

        // set the message to display
        alertbox.setMessage(this.getString(R.string.intro));

        // add a neutral button to the alert box and assign a click listener
        alertbox.setNeutralButton("Register New Account",
                new DialogInterface.OnClickListener() {

                    // click listener on the alert box
                    public void onClick(DialogInterface arg0, int arg1) {
                        // the button was clicked
                    }
                });

        // add a neutral button to the alert box and assign a click listener
        alertbox.setNegativeButton("Login",
                new DialogInterface.OnClickListener() {

                    // click listener on the alert box
                    public void onClick(DialogInterface arg0, int arg1) {
                        // the button was clicked
                    }
                });

        // show it
        alertbox.show();

    }
10-01 14:33:33.028: ERROR/AndroidRuntime(440):
  java.lang.RuntimeException: Unable to start activity ComponentInfo{timer.test/timer.test.menu}:
   java.lang.IllegalStateException:
    System services not available to Activities before onCreate()

我把onCreate放进去但仍然遇到同样的问题。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您有几个选择:

1)将您的public void myLogin(){..}移至您的主要活动。我建议使用此解决方案,因为您不需要为您的目的进行其他活动。

2)在调用myLogin()之前,在登录类上调用startActivity。由于您继承了Activity onCreate,因此在调用其他任何内容之前需要调用它。这就是你得到例外的原因。 startActivity的调用方式如下:

    Intent i = new Intent(this, login.class);  
    startActivity(i);

答案 1 :(得分:1)

你不能这样做只是因为你正在使用上下文

 AlertDialog.Builder alertbox = new AlertDialog.Builder(this); //this is the activity context passed in..

在通过startActivity调用Activity onCreate之前,上下文不可用。而不是通过构造登录对象的新实例,您可以尝试从调用此方法的活动传递上下文

public void myLogin(Context context) {
    // prepare the alert box
    AlertDialog.Builder alertbox = new AlertDialog.Builder(context);
    //blah blah blah...
}

是的,永远不要通过构造函数构建一个活动实例。-.-