webserviceから文字列を取得するワーカースレッド内でUIのTextViewを更新するには、runOnUiThreadを使用する必要があります。私はここにいくつかの他の記事を見て、提供されたソリューションを実装しようとしましたが、私がアプリを起動するとクラッシュします。私はこの方法にあまり慣れていないので、この問題を解決する方法についていくつか指示が必要です。runOnUiThreadを正しく実装する方法
04-2512:19:59.917 4108-4108 /?私/アート:遅くない - Xcheck:jni(既にオン) 04-25 12:19:59.917 4108-4108 /? W/art:デフォルトを使用するX86の予期しないCPUの変形:x86 04-25 12:20:00.147 4108-4108/com.example.gmars.parseltonguev2 W/System:ClassLoaderは未知のパスを参照しています:/data/app/com.example .gmars.parseltonguev2-2/lib/x86 04-25 12:20:00.154 4108-4108/com.example.gmars.parseltonguev2 I/InstantRun:インスタント・ラン開始サーバー:メイン・プロセス 04-25 12:20: 00.218 4108-4108/com.example.gmars.parseltonguev2 D/AndroidRuntime:VMのシャットダウン 04-25 12:20:00.218 4108-4108/com.example.gmars.parseltonguev2 E/AndroidRuntime:致命的除外:メイン 処理: com.example.gmars.parseltonguev2、PID:4108 java.lang.RuntimeException:アクティビティをインスタンス化できません。ComponentInfo {com.example.gmars.parseltonguev2/com.example.gmars.parseltonguev2.MainActivity}:java.lang.NullPointer例外:ヌルオブジェクトリファレンスで仮想メソッド 'android.view.Window $ Callback android.view.Window.getCallback()'を呼び出そうとしました。アンドロイドのアンドロイド.app.ActivityThread.performLaunchActivity(ActivityThread.java:2548) のヌルオブジェクト参照 app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)android.app.ActivityThread.-wrap12(ActivityThread.java)の android.app.ActivityThreadの $ H.handleMessage(ActivityThread.java:1460) はandroid.osにあります.Handler.dispatchMessage(Handler.java:102) とandroid.os.Looper.loop(Looper.java:154) android.app.ActivityThread.main(ActivityThread.java:6077) (ネイティブメソッド) com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(java.lang.reflect.Method.invoke) ZygoteInit.java:755) 原因:java.lang.NullPointerException:android.supportのnullオブジェクト参照 に、仮想メソッド 'android.view.Window $ Callback android.view.Window.getCallback()'を呼び出そうとしました。 v7.app.AppCompatDelegateImplBase。(AppCompatDelegateImplBase.java:120) android.support.v7.app.AppCompatDelegateImplV9た。(AppCompatDelegateImplV9.java:155)android.support.v7.app.AppCompatDelegateImplV11で 。(AppCompatDelegateImplV11.java:31 ) android.support.v7.app.AppCompatDelegateImplV23でandroid.support.v7.app.AppCompatDelegateImplV14。(AppCompatDelegateImplV14.java:55) 。(AppCompatDelegateImplV23.java:33)で android.support.v7.app.AppCompatDelegateImplNました。( AppCompatDelegateImplN.java:33)アンドロイドでandroid.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:185でandroid.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:201) で) 。 (AppCompatActivity.java:190) at y(MainActivity.java:30) at java.lang.Class.newInstance(ネイティブメソッド) android.app。Instrumentation.newActivity(Instrumentation.java:1078)android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2538)で android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)で android.app.ActivityThreadで 。 -wrap12(ActivityThread.java) android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1460) (android.os.Handler.dispatchMessage(Handler.java:102)) (android.os.Looper.loop)にあります。 (Looper.java:154) android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(ネイティブメソッド)com.android.internal.os.ZygoteInit.mainでcom.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:865) で(ZygoteInit.java:755)
Activity updateUI;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
updateUI = this;
itemList = new ArrayList<>();
new GetItemAvailability().execute();
}
@Override
public Void doInBackground(Void... arg0) {
HttpHandler handler = new HttpHandler();
String JSON_DATA = handler.makeServiceCall(url);
Log.e(TAG, "Response from url: " + JSON_DATA);
if (JSON_DATA != null) {
JSON_DATA = JSON_DATA.substring(JSON_DATA.indexOf('{'),JSON_DATA.lastIndexOf('}')+1);
Log.e(TAG, "Substring of response: " + JSON_DATA);
try {
JSONObject reader = new JSONObject(JSON_DATA);
JSONObject availability = reader.getJSONObject("availability");
final String availableQuantity = availability.getString("availableQuantity");
final String defaultBranch = availability.getString("defaultBranch");
final String defaultInventoryBranch = availability.getString("defaultInventoryBranch");
final String inventoryBranch = availability.getString("inventoryBranch");
final String footage = availability.getString("footage");
final String anticipatedStockDate = availability.getString("anticipatedStockDate");
final String discontinuedItemFlag = availability.getString("discontinuedItemFlag");
final String mdc = availability.getString("mdc");
final String mdcquantity = availability.getString("mdcquantity");
HashMap<String, String> item = new HashMap<>();
item.put("availableQuantity", availableQuantity);
item.put("defaultBranch", defaultBranch);
item.put("defaultInventoryBranch", defaultInventoryBranch);
item.put("inventoryBranch", inventoryBranch);
item.put("footage", footage);
item.put("anticipatedStockDate", anticipatedStockDate);
item.put("discontinuedItemFlag", discontinuedItemFlag);
item.put("mdc", mdc);
item.put("mdcquantity", mdcquantity);
itemList.add(item);
updateUI.runOnUiThread(new Runnable() {
@Override
public void run() {
tvAvailableQuantity.setText(availableQuantity);
tvDefaultBranch.setText(defaultBranch);
tvDefaultInventoryBranch.setText(defaultInventoryBranch);
tvInventoryBranch.setText(inventoryBranch);
tvFootage.setText(footage);
tvAnticipatedStockDate.setText(anticipatedStockDate);
tvDiscontinuedItemFlag.setText(discontinuedItemFlag);
tvMdc.setText(mdc);
tvMdcquantity.setText(mdcquantity);
}
});
}
たとえば、「TextView tvAvailableQuantity =(TestView)findViewById(id)」のようにUI変数を初期化する必要があります。 – anatoli
質問を編集してクラッシュのスタックトレースを追加できますか?おそらく 'runOnUiThread()'とは何の関係もなく、もっと情報を与えるでしょう。 –
私は他の変数を使ってonCreateメソッドの直前に行っています。私はrunOnUiThreadに関するコードのスニペットを投稿しました。ありがとう。 –