android 处理程序给出 Null 对象引用错误
android Handler gives Null object reference error
我的进程使用 Handler.but 更新了 UI 线程中的 ProgressBar,它给出了这样的错误。
.Handler.sendMessage(android.os.Message)' 在空对象引用上
请检查我的代码
public class MainActivity extends AppCompatActivity {
Handler handler;
Thread thread;
ProgressBar prb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
prb=(ProgressBar) findViewById(R.id.progress);
thread=new Thread(new MyThread());
thread.start();
handler=new Handler(){
@Override
public void handleMessage(Message msg) {
prb.setProgress(msg.arg1);
}
};
}
class MyThread implements Runnable{
@Override
public void run() {
for (int i=1;i<10;i++) {
Message message = Message.obtain();
message.arg1=i;
handler.sendMessage(message);
try {
thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
这里很明显是错误,
handler.sendMessage(留言);
在您的代码中,您有自己的 Thread
实现,称为 MyThread
。
在此实现中,您使用的是全局变量 handler
.
的引用
问题是:您试图在实例化 handler
变量之前实例化 MyThread
。
所以当你调用 thread.start()
时 handler
是 null
解决方案非常简单:
您需要在初始化 Handler
后启动线程
由于您在 handler=new Handler()
之前开始新线程,因此 handler
在开始时将为空。将 onCreate 更改为此
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
prb=(ProgressBar) findViewById(R.id.progress);
// moved handler initialization
handler=new Handler(){
@Override
public void handleMessage(Message msg) {
prb.setProgress(msg.arg1);
}
};
thread=new Thread(new MyThread());
thread.start();
}
我的进程使用 Handler.but 更新了 UI 线程中的 ProgressBar,它给出了这样的错误。
.Handler.sendMessage(android.os.Message)' 在空对象引用上
请检查我的代码
public class MainActivity extends AppCompatActivity {
Handler handler;
Thread thread;
ProgressBar prb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
prb=(ProgressBar) findViewById(R.id.progress);
thread=new Thread(new MyThread());
thread.start();
handler=new Handler(){
@Override
public void handleMessage(Message msg) {
prb.setProgress(msg.arg1);
}
};
}
class MyThread implements Runnable{
@Override
public void run() {
for (int i=1;i<10;i++) {
Message message = Message.obtain();
message.arg1=i;
handler.sendMessage(message);
try {
thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
这里很明显是错误,
handler.sendMessage(留言);
在您的代码中,您有自己的 Thread
实现,称为 MyThread
。
在此实现中,您使用的是全局变量 handler
.
问题是:您试图在实例化 handler
变量之前实例化 MyThread
。
所以当你调用 thread.start()
handler
是 null
解决方案非常简单:
您需要在初始化 Handler
由于您在 handler=new Handler()
之前开始新线程,因此 handler
在开始时将为空。将 onCreate 更改为此
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
prb=(ProgressBar) findViewById(R.id.progress);
// moved handler initialization
handler=new Handler(){
@Override
public void handleMessage(Message msg) {
prb.setProgress(msg.arg1);
}
};
thread=new Thread(new MyThread());
thread.start();
}