我已经创建了一个全局动作类并在这个类中创建了函数,我正试图在另一个活动中访问我遇到的问题是在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);
}
}
答案 0 :(得分:2)
待办事项
ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
上下文可以使用方法getSystemService()
,但您的类不是上下文,您需要使用mContext
变量。
这意味着您也可以将getApplicationContext()
替换为mContext
。如果您确实需要getApplicationContext()
(不太可能 - 正常的上下文应该可以正常工作),请使用
mContext.getApplicationContext()
此外,您将isOnline()
方法声明为静态,但是您需要使用Context来检查和制作Toast。要么不使它静态或更改它,以便它在上下文中接受,例如
public final static boolean isOnline (Context someContext){
并替换需要带有someContext
的上下文的调用。静态方法不需要类的实例,因此,您不能使用mContext
。一旦修复了现在的getApplicationContext()
问题,编译器就会抛出一个以静态方式访问非静态字段的错误。与您的checkInternet()
相同。我建议你重新评估你的逻辑,你的类有多个问题 - 我建议将一切都设置为一个静态方法,在一个Context中接受,它将由调用Activity给出。
最后要注意在全局非ui类中显示Toasts和其他UI元素。 Toasts应该没问题,因为它们在windows上运行,但是Dialog需要一个窗口,如果mContext
不是Activity
的实例,那将失败(活动有一个窗口,其他上下文(像getApplicationContext()
),不要。