2013-01-23 69 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

感謝您的幫助我編輯了我的代碼,我認爲您的建議是我所做的正確的? –