如何使用"上下文"一个班级到另一个班级 - Android

时间:2014-07-15 14:10:05

标签: java android class android-context

我在一个班级中使用上下文。如何在另一个类中启动它时引用相同的上下文?

MyHttpClient.java

public class MyHttpClient extends DefaultHttpClient {


    final Context contextkey;

    public MyHttpClient(Context contextkeystore) {
        this.contextkey = contextkeystore;
    }

    @Override
    protected ClientConnectionManager createClientConnectionManager() {
        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        // Register for port 443 our SSLSocketFactory with our keystore
        // to the ConnectionManager
        registry.register(new Scheme("https", newSslSocketFactory(), 443));
        return new SingleClientConnManager(getParams(), registry);
    }

    private SSLSocketFactory newSslSocketFactory() {
        try {
            // Get an instance of the Bouncy Castle KeyStore format
            KeyStore trusted = KeyStore.getInstance("BKS");
            // Get the raw resource, which contains the keystore with
            // your trusted certificates (root and any intermediate certs)
            InputStream in = contextkey.getResources().openRawResource(R.raw.mykeystore);
            try {
                // Initialize the keystore with the provided trusted certificates
                // Also provide the password of the keystore
                trusted.load(in, "mysecret".toCharArray());
            } finally {
                in.close();
            }
            // Pass the keystore to the SSLSocketFactory. The factory is responsible
            // for the verification of the server certificate.
            SSLSocketFactory sf = new SSLSocketFactory(trusted);
            // Hostname verification from certificate
            // http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e506
            sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
            return sf;
        } catch (Exception e) {
            throw new AssertionError(e);
        }
    }
}

在另一个班级使用:

DefaultHttpClient client = new MyHttpClient(getApplicationContext()); ?? 

这里" getApplicationContext"不会工作并显示错误

2 个答案:

答案 0 :(得分:2)

获取应用程序上下文的简单方法如下

package com.example.testactivity;

        public class App extends Application {
        public static Context context;

    public void onCreate() {
                    super.onCreate();
                    context=getApplicationContext();
                           }
    public static Context getcontext(){
     return context;
     }

   }

并在清单文件中 在应用程序标记中添加该行

<application
        android:name="com.example.testactivity.App" 
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

现在,您将在应用程序的任何位置使用应用程序的上下文

只需致电

App.getcontext();

Njoy:)

答案 1 :(得分:1)

您需要一个有效的上下文来使用SSL扩展DefaultHttpClient。

调用MyHttpClient构造函数的类似乎没有有效的Context传递给HttpClient。

您应该通过该类将上下文传递到您的客户端:

  • 启动应用启动的位置(启动器活动,服务等...)
  • 创建您的班级(您没有给我们一个名字),传递getApplicationContext或活动演员(此)作为参数。
  • 让您的类创建MyHttpClient,将所述上下文传递给构造函数。

它是:

public class Main extends Activity
{
      private Foo myfoo;

      @Override
      protected void onCreate(Bundle icicle)
      {
             myfoo = new Foo(this); //Or myFoo = new Foo(getApplicationContext());   
      }
}

public class Foo
{
    private Context mycontext;
    private MyHttpClient myclient;

    public Foo(Context ctx)
    {
        mycontext = ctx;//No need to save the context if you aren't reusing it after this.
        myclient = new MyHttpClient(mycontext); 
    }
}