2015-10-10 2 views
0

Я искал везде, и я решил написать здесь. Я пытаюсь получить соединение, когда начнется мое приложение. Моя проблема в том, что мне нужно передать контекст в AsyncTask (или создать ProgressDialog ранее в конструкторе), но мне также нужен контекст.Как получить контекст в конструкторе основного класса?

Самое главное: я не могу переместить вещи из конструктора OnCreate, потому что это сделает новый клиент каждый раз, когда я открываю приложение, вернитесь и т.д.

Проблема заключается в том, что, когда конструктор У меня пока нет контекста.

Любые идеи?

Уже пробовал с этим: StartConnectionTask(this);, но это то же самое.

Обнаружили это: http://briandolhansky.com/blog/2013/7/11/snippets-android-async-progress внедрил его и все тот же. Контекст - null.

public class MainActivity extends AppCompatActivity { 
public Client client; 
public Button loginButton; 
public static String host = "192.168.1.2"; 
public static int tcp_port = 8888, udp_port = 8889; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.menu_layout); 
} 

public MainActivity(){ 
    client = new Client(); 
    client.start(); 
    Network.register(client); 
    StartConnectionTask s = new StartConnectionTask(MainActivity.this); 
    s.execute(); 
} 

public class StartConnectionTask extends AsyncTask<Void, Void, Boolean> { 

    private ProgressDialog conDialog; 

    public StartConnectionTask(MainActivity activity) { 
     conDialog = new ProgressDialog(activity); 
    } 
    @Override 
    protected void onPreExecute() { 
     conDialog.setTitle("Connecting with a server..."); 
     conDialog.setMessage("Connecting with " + host); 
     conDialog.show(); 
     conDialog.setCancelable(false); 
    } 
+0

Когда приложение закрыто, конструктор будет вызван снова в любом случае, так что клиент будет воссоздан. Переместите его в onCreate. И если вы хотите использовать одного и того же клиента в своем приложении, то расширьте класс Application и разместите его там – Sourabh

+0

Oh. Не могли бы вы объяснить, что вы подразумеваете под расширением класса Application? Я застрял с двух дней, пытался с Singletons, SharedPreferences, все ... – Jakub

ответ

0

Как спросил ОП, вот как вы можете изменить ваш класс Application

public class App extends Application { 

    private static App mInstance; 
    private Client mClient; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mInstance = this; 

     // magic and stuff 
     // put anything here and in anywhere in your app, activity 
     // fragment, service, whatever you want 
     // do App.getInstance().whatever() 
     // like App.getInstance().getClient() 

     mClient = new Client(); 
    } 

    public static synchronized App getInstance() { 
     return mInstance; 
    } 

    public static Client getClient() { 
     return mClient; 
    } 

} 

И указать в AndroidManifest.xml

<application 
     android:name=".App" 
     ... > 
+0

Так что я должен просто создать объект App в onCreate (в основном классе), например App c = App.getInstance; , а затем вызвать c.mClient - это правильно, сэр? – Jakub

+0

'c.getClient()', mClient является приватным, но это всего лишь база для вас, вы можете использовать его любым способом. Это просто, чтобы показать вам, как сделать что-то доступным во всем приложении. И поскольку я не знаю, что такое класс Клиента и что он делает, я больше не могу советовать вам – Sourabh

+0

Missed Manifest - работаю, большое вам спасибо! – Jakub

1

вам нужно перенести свой код из MainActivity() в конце onCreate.

В андроиде обычно onCreate - это метод, в котором ваша деятельность начинается с жизненного цикла деятельности. вы можете легко передать контекст здесь пропусканием this

0

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

0

Rahul Tiwari ответ сделаю. Но в случае, если вы хотите реализовать класс Application для получения контекста во всех своих приложениях, попробуйте это.

общественного класса App расширяет приложение {

public static Context context; 

@Override 
public void onCreate() { 
    // Do your stuff here 
    context = getApplicationContext(); 
    super.onCreate(); 
} ... 

и добавить в свой манифест

<application android:label="@string/app_name" 
    android:name="com.your.package.App "> 
Смежные вопросы