如何正确实施runOnUiThread Android

如何正确实施runOnUiThread Android,android,textview,android-runonuithread,Android,Textview,Android Runonuithread,我需要使用runOnUiThread来更新UI中的文本视图,而工作线程从Web服务获取一些字符串。我在这里看过一些其他帖子,并试图实现提供的解决方案,但当我启动我的应用程序时,它崩溃了。我不太熟悉这个方法,所以我需要一些关于如何解决这个问题的指导 04-25 12:19:59.917 4108-4108/?I/art:未延迟启用-Xcheck:jni(已启用) 04-25 12:19:59.917 4108-4108/? W/art:X86的意外CPU变量使用默认值:X86 04-25 12:2

我需要使用runOnUiThread来更新UI中的文本视图,而工作线程从Web服务获取一些字符串。我在这里看过一些其他帖子,并试图实现提供的解决方案,但当我启动我的应用程序时,它崩溃了。我不太熟悉这个方法,所以我需要一些关于如何解决这个问题的指导

04-25 12:19:59.917 4108-4108/?I/art:未延迟启用-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:关闭虚拟机 04-25 12:20:00.218 4108-4108/com.example.gmars.parseltonguev2 E/AndroidRuntime:致命异常:main 进程:com.example.gmars.parseltonguev2,PID:4108 java.lang.RuntimeException:无法实例化activity ComponentInfo{com.example.gmars.parseltonguev2/com.example.gmars.parseltonguev2.MainActivity}:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.view.Window$Callback android.view.Window.getCallback()” 在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2548) 位于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) 位于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.view.Window$Callback android.view.Window.getCallback()” 位于android.support.v7.app.AppCompateDelegateImplbase。(appCompateDelegateImplbase.java:120) 在android.support.v7.app.AppCompateDelegateImplv9。(AppCompateDelegateImplv9.java:155) 位于android.support.v7.app.AppCompateDelegateImplv11。(AppCompateDelegateImplv11.java:31) 在android.support.v7.app.AppCompateDelegateImplv14。(AppCompateDelegateImplv14.java:55) 在android.support.v7.app.AppCompateDelegateImplv23。(appCompateDelegateImplv23.java:33) 在android.support.v7.app.AppCompateDelegateImpln。(appCompateDelegateImpln.java:33) 在android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:201)中 在android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:185)上 位于android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:519) 位于android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:190) 位于com.example.gmars.parseltonguev2.MainActivity。(MainActivity.java:30) 位于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)
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);
                    }
                });

            }