2017-04-25 94 views
0

我需要使用runOnUiThread在UI更新一個TextView,而一個工作線程它得到一些字符串從Web服務中。我在這裏查看了一些其他帖子並試圖實現提供的解決方案,但是當我啓動我的應用程序時,它崩潰了。我不太熟悉這種方法,所以我需要一些方法來解決這個問題。如何正確實現runOnUiThread的Android

04-25 12:19:59.917 4108-4108 /?我/藝術:不遲到啓用-Xcheck:jni(已開啓) 04-25 12:19:59.917 4108-4108 /? W /藝術:用於使用默認X86意外CPU變體:86 12月4日至25日:20:00.147 4108-4108/com.example.gmars.parseltonguev2 W /系統:類加載器引用未知路徑:/data/app/com.example .gmars.parseltonguev2-2/LIB/86 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:關閉虛擬機 04-25 12:20:00.218 4108-4108/com.example.gmars.parseltonguev2 E/AndroidRuntime:致命例外:main 過程: com.example.gmars.parseltonguev2,PID:4108 了java.lang.RuntimeException:無法實例活動ComponentInfo {com.example.gmars.parseltonguev2/com.example.gmars.parseltonguev2.MainActivity}:java.lang.NullPointer例外:嘗試在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2548) 在機器人上的空對象引用 調用虛擬方法「android.view.Window $回調android.view.Window.getCallback()」。在android.app.ActivityThread.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1460) at android.os .Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) 在java.lang.reflect.Method.invoke(本機方法) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:865) 在com.android.internal.os.ZygoteInit.main( ZygoteInit.java:755) 引起:顯示java.lang.NullPointerException:嘗試在上一個android.support空對象引用 調用虛擬方法android.view.Window $回調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.AppCompatDelegateImplV14。(AppCompatDelegateImplV14.java:55) 在android.support.v7.app.AppCompatDelegateImplV23。(AppCompatDelegateImplV23.java:33) 在android.support.v7.app.AppCompatDelegateImplN。( AppCompatDelegateImplN.java:33) at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:201) at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:185) at android。在com.example.gmars.parseltonguev2.MainActivit上的android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:190) y。(MainActivity.java:30) at android.app java.lang.Class.newInstance(Native Method) 。Instrumentation.newActivity(Instrumentation.java:1078) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2538) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) at android.app.ActivityThread。 -wrap12(ActivityThread.java) at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1460) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop (Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:865) 在com.android.internal.os.ZygoteInit.main(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

您必須初始化UI變量,例如'TextView tvAvailableQuantity =(TestView)findViewById(id)' – anatoli

+0

您可以編輯您的問題並添加崩潰堆棧跟蹤?可能它與'runOnUiThread()'無關,它會給我們更多的信息。 –

+0

我已經在onCreate方法之前使用其他變量完成了該操作。我只發佈了有關runOnUiThread的代碼片段。謝謝。 –

回答

0

你的runOnUiThread()的實現是正確的。您將它傳遞給在UI線程上運行的runnable。

在你的情況不過,我覺得這甚至不是必要的,如果你改變你的AsyncTask爲String的結果類型,你可以簡單地從doInBackground()方法返回JSON_DATA和代碼的其餘部分進入onPostExecute()運行於無論如何,UI線程。

+0

謝謝,我在onCreate之前初始化了我的TextViews。但是,哪種更好的做法是使用runOnUiThread還是你的方法? –

+0

通常,如果您需要例如使用runOnUiThread,向用戶展示某些東西,而您正處於在不同線程中執行某些操作的過程中。在你的情況下,你的網絡訪問(首先要求單獨的線程)已經結束,所以在這種情況下,我會說我的建議在這裏更可取 - 它更容易閱讀,縮短一點,而你不需要創建Runnable對象。 – Ridcully