我正在开发一个SMS应用程序,我在MainActivity
中有一个方法来执行按钮点击:
public void updateMessage() {
ViewMessages.performClick();
}
当我从MainActivity
类中调用此方法时,此方法正常工作并执行按钮单击
但是,当我从任何其他类调用此方法时,如下所示,我从updateMessage
类调用主活动的IntentServiceHandler
方法,我得到NullPointerException
:
java.lang.NullPointerException:尝试调用虚方法' boolean android.widget.Button.performClick()'在空对象引用上
public class IntentServiceHandler extends IntentService {
public IntentServiceHandler() {
super("IntentServiceHandler");
}
@Override
protected void onHandleIntent(Intent intent) {
String message = intent.getStringExtra("message");
TransactionDataBase transactionDB = new TransactionDataBase(this, 1);
transactionDB.addMessage(message);
MainActivity mainActivity = new MainActivity();
mainActivity.updateMessage();
}
}
我该如何处理?
编辑:我甚至尝试将updateMessage方法设为静态,现在我得到以下异常
android.view.ViewRootImpl $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图。
答案 0 :(得分:1)
不要在IntentService中调用Activity的方法,尝试使用Intent在Activity和IntentService之间进行通信。
使用
替换onHandleIntent()的最后两个语句Intent intent = new Intent();
broadcastIntent.setAction(MainActivity.UPDATE_MESSAGE);
broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
sendBroadcast(intent);
你应该在MainAcitivty的onCreate()中注册一个BroadcastReceiver,如
private BroadcastReceiver receiver;
@Override
public void onCreate(Bundle savedInstanceState){
// ....
IntentFilter filter = new IntentFilter();
filter.addAction(UPDATE_MESSAGE);
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// do something based on the intent's action
// for example, call updateMessage()
}
};
registerReceiver(receiver, filter);
}
onHandle IntentService的内容在另一个线程(而不是主线程/ ui线程)中运行,因此不允许在onHandleIntent中更新UI组件。