Android:onCreate布尔值没有改变

时间:2015-10-22 21:38:32

标签: java android

在我正在使用线程开发Im的android应用程序中,并确保我没有得到“java.lang.IllegalStateException:在onCreate()之前活动不可用的系统服务”我使用了一个名为donecreate的布尔值。问题是Android工作室说我在picLoop.run上有一个“java.lang.NullPointerException(picLoop.java:24)”

代码主类:

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.media.AudioManager;

import android.os.Bundle;
import android.view.Display;

import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;


public class main extends Activity {
public Boolean donecreate;
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(new eyeCanvas(this));
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    docreate();
}
public void docreate(){
    donecreate = true;
}
public void checkHead(){
    AudioManager am = (AudioManager)getSystemService(AUDIO_SERVICE);
    if(am.isWiredHeadsetOn()){
        Toast.makeText(getApplicationContext(), "HEADPHONES",         Toast.LENGTH_LONG).show();
    }
    }



}

代码:pic循环

import android.graphics.Canvas;



//**Threading
public class picLoop extends Thread {
private eyeCanvas eye;
private main main = new main();
public picLoop(eyeCanvas eye) {
    this.eye = eye;
}

@Override
public void run(){


    Canvas c = null;

while(true) {
if(main.donecreate){ //<-- where error is
main.checkHead();
}

try {
  //  head.onCreate(Bundle savedInstanceState);
    c = eye.getHolder().lockCanvas();
    synchronized (eye.getHolder()) {
        eye.onDraw(c);
    }
} finally {
    if (c != null) {
        eye.getHolder().unlockCanvasAndPost(c);
    }
}

try {
    sleep(1000);
} catch (InterruptedException e) {
    e.printStackTrace();
 }

 }
   }

   }

另外,如果你们能给我反馈我的提交方式,那会有所帮助:)

4 个答案:

答案 0 :(得分:2)

您无法创建像您一样的活动。您永远不能做新的Activity()&#39;,因为系统需要启动活动才能正确设置并按预期完成其生命周期。

删除行private main main = new main();。 要做你正在尝试的事情,请将布尔值设为静态变量。

更改

public Boolean donecreate;

public static Boolean donecreate;

然后,您可以像尝试一样尝试访问它,而无需创建主要活动的实例。

答案 1 :(得分:1)

你所做的假设有很多问题。首先,如果您的Thread要求创建Activity,则在创建Activity 之前不会启动它。在Activity本身内管理该对象的生命周期,即:

@Override
public void onStart() {
    super.onStart();
    // Start your work here
}

@Override
public void onStop() {
    super.onStop();
    // Stop your work here
}

其次,请不要使用建议的静态访问方法 - 假设只有一个Activity实例(在配置更改时立即出错,和/或如果您启动另一个任务中Activity的实例)。即使该假设 为真,您也需要在false中将其设置回onDestroy()(仍然不要这样做)。

答案 2 :(得分:0)

首先尝试将donecreate设置为false

public class main extends Activity {
    public Boolean donecreate = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {

    ....

答案 3 :(得分:0)

您可以在应用程序上下文中请求系统服务,请查看此answer。 因此,在应用程序类中创建一个静态变量,在onCreate of Application类中将其初始化为instance = this;,然后您就可以随时获取应用程序上下文。