Как начать деятельность из класса Java? - PullRequest
4 голосов
/ 14 декабря 2011

Я прочитал несколько постов о том, как я могу вызвать активность Android из другого Java-класса, реализованного в приложении, но ответа на мою проблему нет.

У меня есть класс соединения (Connection.java), который обрабатываетпостоянное соединение, необходимое для приложения.Этот сконструирован с использованием шаблона Singleton, поэтому каждый раз, когда мне нужна информация о соединении или я запрашиваю что-то, что я делаю:

final Connection conn = Connection.getConnection(getApplicationContext());
//... Some Code Here
conn.methodDoSomethingA();

Затем у меня есть TabActivity, которое содержит 5 действий (A, B, C, D, E):

public class Tab extends TabActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tab);

        final Connection conn = Connection.getConnection(getApplicationContext());

        intent = new Intent().setClass(this, A.class);
        spec = tabHost.newTabSpec("A")
                .setIndicator("A", res.getDrawable(R.drawable.tab_A))
                .setContent(intent);
        tabHost.addTab(spec);

        //... same for activities B, C, D and E

        tabHost.setCurrentTab(0);
    }
}

Теперь у меня есть открытый метод в классе соединения для завершения соединения - endConnection() - который вызывается несколько раз в классе соединения, например, когда есть время ожидания гнезда или при получениипользовательское сообщение от сервера, информирующее о завершении сеанса.

Проблема начинается здесь - когда вызывается endConnection(), он должен закрыть сокеты и затем показать Activity (Theme.Dialog), сообщающий, что соединение потеряно.Чтобы добиться этого, я сделал это безуспешно:

public class Connection {
    private static Connection connection = null;
    private Context appContext = null;

    private Connection(Context appContext) {
        this.appContext = appContext;
    }

    public static Connection getConnection(Context appContext) {
        if (connection == null)
            return connection = new Connection(appContext);
        else
            return connection;
    }

    public void endConnection() {
        // ... Close sockets and streams - SOME CODE HERE

        // Show Disconnect Dialog
        Intent myIntent = new Intent(appContext, Disconnect.class);
        myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        appContext.startActivity( myIntent );
    }
}

Я также попытался передать контекст TabActivity в качестве аргумента классу Connection.java и использовал его вместо appContext, но безлибо успех.

Я получаю следующие ошибки:

W/dalvikvm(9449): threadid=3: thread exiting with uncaught exception (group=0x2aaca228)
E/AndroidRuntime(9449): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime(9449): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.test.Disconnect}: java.lang.NullPointerException

Другими словами: - Как запустить Activity из класса Java?!

1 Ответ

4 голосов
/ 15 декабря 2011

Я нашел ошибку.

Прежде всего, я хочу поблагодарить вас всех за ваши комментарии.

Видимо, я все сделал хорошо, и вот какэто сделано!

Ошибка была ошибкой новичка, которая смущает меня:

Disconnect.java имел прослушиватель кнопки, которой не было в его файле макета XML представления содержимого, но этосуществует в другом макете!

Я никогда не подозревал об этом!Глупо, не правда ли??

Надеюсь, этот пост может помочь всем по одной из двух вещей:

  1. вызов действия из другого java-класса ;
  2. не задавайте вопросы, не исследуя немыслимые ошибки !!!
...