前提・今やっていること
超初心者です。初めて質問します。
Android StudioでHTTP通信をする電卓を作っています。
その2つを組み合わせる意味は特に無いです。基礎をまとめてやっちゃおうという感じです。
クライアントはJavaで書いています。
クライアントの通信にはokhttp3を採用して、非同期で通信しています。
メインスレッドからokhttp3のスレッドに値を渡してサーバと通信、レスポンスを受け取ることまではできました。
そこから、メインスレッドへ値を渡してテキストボックスに表示させたいのですが、HandlerとThread、Runnableの書くべき場所がわかりません。
私が今うっすらと思ってることは
・メインスレッドのメインクラス?の中でHandlerを宣言する必要がある
・サブスレッドでvoid run()をどこでもいいから書かないといけない?
・サブスレッドでHandlerは書かなくて良い
・そのrun()に到達すると、メインスレッドのHandlerに渡ってrun()の中に書いてあったことが実行される…?
・結局スレッドってどこで使うの?
試行錯誤してるソースコードが以下です…
なんか支離滅裂な文章ですが…足りない情報があれば随時補足します!
メインスレッドのソースコード
Java
1package com.example.hogehoge.calculater; 2 3import android.os.Handler; 4import android.os.HandlerThread; 5import android.os.Looper; 6import android.os.Message; 7 8import android.support.v7.app.AppCompatActivity; 9import android.os.Bundle; 10import android.view.View; 11import android.widget.Button; 12import android.widget.TextView; 13 14public class MainActivity extends AppCompatActivity { 15 16 TextView textView; 17 Button button; 18 Handler handler = new Handler(); 19 20 @Override 21 protected void onCreate(Bundle savedInstanceState) { 22 super.onCreate(savedInstanceState); 23 setContentView(R.layout.activity_main); 24 25 26 textView = (TextView) findViewById(R.id.formula); 27 28 findViewById(R.id.num1).setOnClickListener(buttonNumberListener); 29 findViewById(R.id.num2).setOnClickListener(buttonNumberListener); 30 findViewById(R.id.num3).setOnClickListener(buttonNumberListener); 31 findViewById(R.id.num4).setOnClickListener(buttonNumberListener); 32 findViewById(R.id.num5).setOnClickListener(buttonNumberListener); 33 findViewById(R.id.num6).setOnClickListener(buttonNumberListener); 34 findViewById(R.id.num7).setOnClickListener(buttonNumberListener); 35 findViewById(R.id.num8).setOnClickListener(buttonNumberListener); 36 findViewById(R.id.num9).setOnClickListener(buttonNumberListener); 37 findViewById(R.id.num0).setOnClickListener(buttonNumberListener); 38 findViewById(R.id.coron).setOnClickListener(buttonNumberListener); 39 findViewById(R.id.NEXT_INT).setOnClickListener(buttonNumberListener); 40 findViewById(R.id.add).setOnClickListener(buttonNumberListener); 41 findViewById(R.id.substract).setOnClickListener(buttonNumberListener); 42 findViewById(R.id.divide).setOnClickListener(buttonNumberListener); 43 findViewById(R.id.multiply).setOnClickListener(buttonNumberListener); 44 findViewById(R.id.Clear).setOnClickListener(buttonNumberListener); 45 findViewById(R.id.equal).setOnClickListener(buttonNumberListener); 46 findViewById(R.id.BACK).setOnClickListener(buttonNumberListener); 47 } 48 49 View.OnClickListener buttonNumberListener = new View.OnClickListener() { 50 @Override 51 public void onClick(View view) { 52 Button button = (Button) view; 53 54 55 switch (view.getId()){ 56 case R.id.NEXT_INT: 57 textView.append(" "); 58 break; 59 case R.id.Clear: 60 textView.setText(""); 61 break; 62 case R.id.BACK: 63 if (textView.length() > 0 && textView.getText() != null) { 64 String temp = textView.getText().toString(); 65 temp = temp.substring(0, temp.length() - 1); 66 textView.setText(temp); 67 } 68 break; 69 case R.id.equal: 70 HttpClient.okhttp3Client(textView.getText().toString()); 71 break; 72 default: 73 textView.append(button.getText()); 74 } 75 } 76 }; 77 78 //以下のメソッドを新しく追加しました。 79 public void CompAnswer(Looper toLooper,final String Answer) { 80 setContentView(R.layout.activity_main); 81 textView = (TextView) findViewById(R.id.formula); 82 new Handler(toLooper).post(new Runnable() { 83 @Override 84 public void run() { 85 86 //このテキストビューまでは到達できました。 87 //実行しようとするとアプリ自体が落ちることは確認できました。 88 textView.setText(Answer); 89 90 return; 91 } 92 }); 93 } 94}
HttpClientのソースコード
Java
1package com.example.hogehoge.calculater; 2 3import android.os.Looper; 4 5import java.io.IOException; 6 7import okhttp3.Callback; 8import okhttp3.MediaType; 9import okhttp3.OkHttpClient; 10import okhttp3.Call; 11import okhttp3.Request; 12import okhttp3.RequestBody; 13import okhttp3.Response; 14 15 16public class HttpClient { 17 18 MainActivity test1; 19 20 static void okhttp3Client(final String strNum) { 21 // TODO Auto-generated method stub 22 23 String url = "http://hogehoge.site"; 24 OkHttpClient client = new OkHttpClient(); 25 26 27 try { 28 29 Request request = new Request.Builder() 30 .url(url) 31 .post(RequestBody.create(MediaType.parse("text/plain;charset=utf-8"),strNum)) 32 .build(); 33 34 Call call = client.newCall(request); 35 call.enqueue(new Callback() { 36 @Override 37 public void onFailure(Call call, IOException e) 38 { 39 //エラー処理を書く 40 } 41 42 @Override 43 public void onResponse(Call call, Response response) throws IOException 44 { 45 //この1行を追加しました。 46 new MainActivity().CompAnswer(Looper.getMainLooper(),response.body().string()); 47 } 48 }); 49 50 51 }catch(Exception e) { 52 53 } 54 } 55} 56
エラー文
ErorrMessage
1 java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference 2 at android.support.v7.app.AppCompatDelegateImpl.<init>(AppCompatDelegateImpl.java:249) 3 at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:182) 4 at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:520) 5 at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140) 6 at com.example.hogehoge.calculater.MainActivity.CompAnswer(MainActivity.java:79) 7 at com.example.hogehoge.calculater.HttpClient.okhttp3Client(HttpClient.java:24) 8 at com.example.hogehoge.calculater.MainActivity$1.onClick(MainActivity.java:70) 9 at android.view.View.performClick(View.java:6294) 10 at android.view.View$PerformClick.run(View.java:24770) 11 at android.os.Handler.handleCallback(Handler.java:790) 12 at android.os.Handler.dispatchMessage(Handler.java:99) 13 at android.os.Looper.loop(Looper.java:164) 14 at android.app.ActivityThread.main(ActivityThread.java:6494) 15 at java.lang.reflect.Method.invoke(Native Method) 16 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 17 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 18

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/03 15:09
2019/03/03 15:41 編集
2019/03/04 14:09
2019/03/04 16:31
2019/03/05 10:32