2017-04-25 36 views
0

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); 
        } 
       }); 

      } 
+1

たとえば、「TextView tvAvailableQuantity =(TestView)findViewById(id)」のようにUI変数を初期化する必要があります。 – anatoli

+0

質問を編集してクラッシュのスタックトレースを追加できますか?おそらく 'runOnUiThread()'とは何の関係もなく、もっと情報を与えるでしょう。 –

+0

私は他の変数を使ってonCreateメソッドの直前に行っています。私はrunOnUiThreadに関するコードのスニペットを投稿しました。ありがとう。 –

答えて

0

あなたのrunOnUiThread()の実装は正しいです。 UIスレッド上で実行されるrunnableに渡します。あなたのケースでは

しかし、私は、これはあなたがStringにあなたのAsyncTaskの結果の型を変更した場合、あなたは、単にdoInBackground()方法からJSON_DATAを返すとonPostExecute()にコードの残りの部分を移動することができます上で実行する必要もないと思いますUIスレッドはとにかく。

+0

ありがとうございます、私はonCreateの前にTextViewsを初期化しました。しかし、これはrunOnUiThreadやメソッドを使う方が良いでしょうか? –

+0

通常、必要な場合はrunOnUiThreadを使用します。あなたが別のスレッドで何かをやっている間に何かをユーザーに見せてください。あなたのケースでは、ネットワークアクセス(最初は別のスレッドを要求していました)はすでに終了しています。この場合は、私の提案がここでは望ましいと言えます - 読みやすく、少し短く、 Runnableオブジェクトを作成する必要はありません。 – Ridcully

関連する問題