2013-01-23 34 views
0

您好我已经创建了一个全局的动作类,并创建了这个类内部的功能,我试图访问另一个活动内我遇到的问题是在日食我得到编码错误访问系统功能的函数(如getSystemService()和getApplicationContext())的确有人知道为什么或如何让全局类接受系统功能?访问系统功能的全球功能android

继承人什么我到目前为止我的继承人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); 


    }   



} 
+0

你可能想看看http://developer.android.com/reference/android/app/Application.html – MrZander

+0

@MrZander我并不建议扩展应用程序,也不要做文档:*“通常没有必要在大多数情况下,静态单例可以以更模块化的方式提供相同的功能。“* –

回答

2

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

上下文可以使用的方法getSystemService()但你的类不是一种背景下,您需要使用您的mContext变量。

这意味着您也可以用mContext替代getApplicationContext()。如果你真的需要getApplicationContext()(不太可能 - 正常的语境应该可以正常工作),使用

mContext.getApplicationContext() 

而且,你声明你的isOnline()方法,静态的,但你需要使用一个Context检查和制作面包。要么不让它静态改变它,所以它接受一个背景下,如

public final static boolean isOnline (Context someContext){ 

并更换需要someContext上下文电话那里。静态方法不需要该类的实例,因此,不能使用mContext。一旦你修复了现在的问题getApplicationContext(),编译器应该以静态的方式抛出一个关于访问非静态字段的错误。与您的checkInternet()相同。我建议你重新评估你的逻辑,你的类有多个问题 - 我建议把所有的东西都做成一个静态的方法,接受一个Context,它将被调用Activity给出。

最后要小心在全球非UI类中显示Toast和其他UI元素。 Toast应该没问题,因为它们运行在窗口之上,但是Dialog将需要一个窗口,并且如果mContext不是Activity的实例,那将失败(活动有一个窗口,其他上下文(如getApplicationContext()),不要。

+0

嗨,这很好,谢谢你很高兴有一个答案不仅给出,但解释。有一件事我有一个问题是要求我将mContext的修饰符更改为导致它中断的静态,但是您是否知道这是为什么? –

+0

@LukeBatley你不能访问静态方法中的非静态字段。我真的建议你让整个类只包含静态方法,并让每个Activity都作为每个方法调用的Context来传递。让这个类实例化(通过'new')是一种浪费 - 更不用说会导致更多的问题。 –

+0

感谢您的帮助我编辑了我的代码,我认为您的建议是我所做的正确的? –