有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我到处寻找,决定在这里写作。当我的应用程序启动时,我正在尝试建立连接。我的问题是,我需要将上下文传递给AsyncTask(或者在构造函数的前面创建ProgressDialog)——但我也需要上下文

最重要的是:我不能将东西从构造函数移动到onCreate,因为每次打开应用程序、返回等时,它都会生成一个新的客户端

问题是,当构造函数被激发时,我还没有上下文

有什么想法吗

已经尝试过:StartConnectionTask(this);但这是一样的

找到这个:http://briandolhansky.com/blog/2013/7/11/snippets-安卓-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);
    }

共 (3) 个答案

  1. # 1 楼答案

    正如OP所问,下面是如何重写应用程序类

    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. # 2 楼答案

    拉胡尔·蒂瓦里的回答就行了。但是,如果您想实现应用程序类以在整个应用程序中获取上下文,请尝试以下方法

    公共类应用程序扩展应用程序{

    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 ">
    
  3. # 3 楼答案

    活动扩展上下文类。当一个活动启动时,它会在其生命周期中流动,所以活动构造函数不需要您将此构造函数代码放入on create方法中