如何在主类构造函数中获取上下文?

时间:2015-10-10 19:42:05

标签: java android

我到处搜索,我决定写在这里。我正在尝试在我的应用启动时实现连接。我的问题是我需要将上下文传递给AsyncTask(或者在构造函数的早期创建ProgressDialog) - 但我还需要上下文。

最重要的是:我无法将构造函数移动到onCreate,因为每次打开应用程序时都会创建一个新客户端,返回等等。

问题在于,当构造函数被触发时,我还没有上下文。

有什么想法吗?

已经尝试过这个:StartConnectionTask(this);但这是同样的事情。

找到了这个:http://briandolhansky.com/blog/2013/7/11/snippets-android-async-progress 实现它仍然是相同的。 上下文为空。

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);
    }

4 个答案:

答案 0 :(得分:1)

您需要将代码从 ERROR: Subquery evaluated to more than one row. 转移到MainActivity()的末尾。

在Android中,传统上onCreate是您的活动按活动生命周期开始的方法。 您可以通过传递onCreate

轻松地从此处传递上下文

答案 1 :(得分:0)

根据OP的要求,您可以在此处覆盖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"
        ... >

答案 2 :(得分:0)

活动扩展上下文类。当一个活动开始时,它会流动她的生命周期,所以活动构造函数不需要你把这个构造函数代码放在create方法上。

答案 3 :(得分:0)

Rahul Tiwari的回答将会如此。但是,如果您想要实现Application类来获取整个应用程序中的上下文,请尝试这样做。

public class App扩展了Application {

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 ">