#android #multithreading
#Android #многопоточность
Вопрос:
У меня есть настройка основного класса и рабочий поток, один из моих ранних запросов, которые я делаю 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
, но все еще сталкиваюсь с той же проблемой. Как я могу это исправить?
Комментарии:
1. почему бы вам не сделать действие входа в систему основным действием?
Ответ №1:
У вас есть несколько вариантов:
1) Переместите свой public void myLogin() {..} в свою основную деятельность. Я рекомендую это решение, поскольку вам не нужно другое действие для ваших целей.
2) Вызовите startActivity в своем классе login перед вызовом myLogin(). Поскольку вы наследуете от Activity, необходимо вызвать onCreate, прежде чем вызывать что-либо еще. Вот почему вы получаете исключение. startActivity вызывается следующим образом:
Intent i = new Intent(this, login.class);
startActivity(i);
Ответ №2:
Вы не можете сделать это таким образом просто потому, что используете контекст
AlertDialog.Builder alertbox = new AlertDialog.Builder(this); //this is the activity context passed in..
Контекст недоступен до тех пор, пока Activity onCreate не будет вызван через startActivity . и не создавая новый экземпляр объекта login, вы можете попробовать передать контекст из действия, вызывающего этот метод
public void myLogin(Context context) {
// prepare the alert box
AlertDialog.Builder alertbox = new AlertDialog.Builder(context);
//blah blah blah...
}
да и никогда не создавайте экземпляр activity через конструктор .. -.-