0

こんにちは、グローバル アクション クラスを作成し、このクラス内に別のアクティビティ内でアクセスしようとしている関数を作成しました。問題は、Eclipse で getSystemService などのシステム機能にアクセスする関数の周りでコーディング エラーが発生することです。 () および getApplicationContext() は、グローバル クラスにシステム機能を許可する理由または方法を知っていますか?

私がこれまでに持っているものはここにあります私のGloblActions.Javaはここにあります

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;

public class GlobalActions{
        Context mContext;

        // constructor
        public GlobalActions(Context context){
            this.mContext = context;
        }


        public final static boolean isOnline (Context someContext){ {

            Log.v("globals", "isonline");

    ConnectivityManager cm = (ConnectivityManager) someContext.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();

        if (netInfo != null && netInfo.isConnectedOrConnecting()) {
            return true;
        }
        return false;
        }

}



        public final static void checkInternet(Context someContext){

                    isOnline(someContext);
                    if(isOnline(someContext) == false){
                       Log.v("globals", "isOnline = false");
                       Intent register = new Intent(someContext.getApplicationContext(), LoginForm.class);
                       someContext.startActivity(register);
                    }
                }



        }   

アクティビティで関数を使用している場所です。私の目標は、グローバル関数を呼び出すだけですべてのアクティビティのインターネット接続を確認し、接続が見つからない場合は、インターネット接続がないというアクティビティに移動することです。

import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.TextView;
import android.os.Handler;
import com.myApp.myApp.GlobalActions;

public class IntroLoader extends Activity {

    public Handler handler;
    public TextView loadText = null;
    public Animation AniFadein = null;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.lo_introloader);
        findViewById(R.id.progressBar1).setVisibility(View.GONE);
        findViewById(R.id.loadTextView).setVisibility(View.GONE);
         GlobalActions.isOnline(null);
         GlobalActions.checkInternet(null);

        handler = new Handler();
        final Runnable fadeIn = new Runnable()
        {
            public void run() 
            {
               animations();
               findViewById(R.id.progressBar1).setVisibility(View.VISIBLE);
               findViewById(R.id.loadTextView).setVisibility(View.VISIBLE);
                         }
        };
        handler.postDelayed(fadeIn, 3000);

        final Runnable aSyncTask= new Runnable()
        {
            public void run() 
            {

               PostTask posttask;
               posttask = new PostTask();
               posttask.execute();

            }
        };
        handler.postDelayed(aSyncTask, 4000);

    }

    public void animations(){

        loadText = (TextView)findViewById(R.id.loadTextView);
        AniFadein = AnimationUtils.loadAnimation(this, R.anim.fadein);  
        loadText.startAnimation(AniFadein); 

    }


  public class PostTask extends AsyncTask<Void, String, Boolean> {

        protected void onPreExecute() {
            super.onPreExecute();

        }

        @Override
        protected Boolean doInBackground(Void... params) {
            boolean result = false;
            publishProgress("progress");
            return result;
        }

        protected void onProgressUpdate(String... progress) {
            StringBuilder str = new StringBuilder();
                for (int i = 1; i < progress.length; i++) {
                    str.append(progress[i] + " ");

                }
        }

            @Override
        protected void onPostExecute(Boolean result) {
            super.onPostExecute(result);
            checkLoginData();
          }
    }

  public void checkLoginData(){

      Intent register = new Intent(getApplicationContext(), LoginForm.class);
      startActivity(register);


  }         



}
4

1 に答える 1

2

行う

 ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);

コンテキストはメソッドを使用できますが、クラスはコンテキストではないため、変数getSystemService()を使用する必要があります。mContext

これは、 で置き換えることもできることを意味しgetApplicationContext()ますmContext。そして、本当に必要な場合getApplicationContext()(可能性は低い - 通常のコンテキストは正常に動作するはずです)、使用します

mContext.getApplicationContext()

また、メソッドを静的として宣言しますisOnline()が、トーストのチェックと作成には Context を使用する必要があります。静的にしないかコンテキストで受け入れるように変更しないでください。

public final static boolean isOnline (Context someContext){

そして、コンテキストが必要な呼び出しを に置き換えますsomeContext。静的メソッドはクラスのインスタンスを必要としないため、mContext. 現在の問題を修正するgetApplicationContext()と、コンパイラは非静的フィールドへの静的な方法でのアクセスに関するエラーをスローするはずです。あなたと同じcheckInternet()です。ロジックを再評価することをお勧めします。クラスには複数の問題があります。呼び出し元のアクティビティによって提供される Context で受け入れるすべての静的メソッドを作成することをお勧めします。

最後に、UI 以外のグローバル クラスでトーストやその他の UI 要素を表示する場合は注意してください。トーストはウィンドウの上で実行されるため問題ありませんが、ダイアログにはウィンドウが必要であり、 がmContextのインスタンスでない場合はActivity失敗します (アクティビティにはウィンドウがあり、他のコンテキスト ( などgetApplicationContext()) にはありません。

于 2013-01-23T21:00:52.607 に答える