在我正在使用线程开发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();
}
}
}
}
另外,如果你们能给我反馈我的提交方式,那会有所帮助:)
答案 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;
,然后您就可以随时获取应用程序上下文。