###前提・実現したいこと
Androidでアプリ開発をしています。
ServiceからActivityのTextViewに文字列を渡す機能を実装しようとしているのですが
以下のエラーメッセージが発生しました。
センサーが値を取得した時に呼ばれるonSensorChangedの中でサーバーとHTTP通信をするようのスレッドを立てるのですが、そのスレッドの中でMainActivityのテキストビューに文字列を代入しようとしています。
###発生している問題・エラーメッセージ
FATAL EXCEPTION: main Process: com.example.kimuratomoya.sensor_db_backup, PID: 14643 java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View com.example.kimuratomoya.sensor_db_backup.MainActivity.findViewById(int)' on a null object reference at com.example.kimuratomoya.sensor_db_backup.SendDataService.ChangeTextView(SendDataService.java:88) at com.example.kimuratomoya.sensor_db_backup.SendDataService$3$2.run(SendDataService.java:601) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5253) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:900) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:695)
###該当のソースコード
public class MainActivity extends AppCompatActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); 〜中略〜 //成功したHTTPリクエスト数と失敗したHTTPリクエスト数のカウント new SendDataService(this); 〜中略〜
public class SendDataService extends Service implements SensorEventListener, LocationListener { private static MainActivity mainActivity; private Context context = this; private Context activitycon; public int errornum=0,sucnum=0; public TextView success_text, error_text; 〜中略〜 //引数のないコンストラクタを作らないといけない。 public SendDataService(){ } //MainActivity.javaから受け取ったContextを変数に代入するための関数 public SendDataService(Context con){ activitycon = con; } //テキストビューを変更する関数 public void ChangeTextView(Context con, Integer sucstr, Integer erstr){ //Context testcon = mainActivity.getBaseContext(); success_text = (TextView)((com.example.kimuratomoya.sensor_db_backup.MainActivity) activitycon).findViewById(R.id.success_id); success_text.setText(sucstr); error_text = (TextView)((com.example.kimuratomoya.sensor_db_backup.MainActivity) activitycon).findViewById(R.id.error_id); error_text.setText(erstr); } 〜中略〜 public int onStartCommand(Intent intent, int flags, int startId) { 〜中略〜 } @Override public void onSensorChanged(SensorEvent event) { 〜中略〜 Log.d("sensor", "スレッド立ち上げ"); // 通信用のスレッドを起動 new Thread(new Runnable() { @Override public void run() { try { 〜中略〜 //テキストビューを変更する関数を呼び出しているところ sucnum += 1; ChangeTextView(activitycon, sucnum, errornum); } catch (Exception e) { try { //テキストビューを変更する関数を呼び出しているところ errornum += 1; ChangeTextView(activitycon, sucnum, errornum); if (conn != null) conn.disconnect(); } 〜中略〜 }).start(); } 〜中略〜 }
###試したこと
public SendDataService(Context con)にMainActivityから直接コンテキストを渡せばテキストビューを変更できるのですが、Service内の他の関数(onSensorChanged)などからも、テキストビューを変更したくて、このようなプログラムになっています。
AplicationContextやActivityContextの違いなども調べたのですが、具体的にどのようにすればいいのかが、わかりません。
ChangeTextView()の中でgetAplicationContextを使ってコンテキストを取得しようとしたりしたのですが、同じエラーが出てしまいました。
###補足情報(言語/FW/ツール等のバージョンなど)
Android Studio 2.1.2
回答2件
あなたの回答
tips
プレビュー