Java 从片段更新UI

Java 从片段更新UI,java,android,multithreading,android-fragments,Java,Android,Multithreading,Android Fragments,我有一个片段,它通过带有onActivityResult(…)的intent从DialogFragment获取数据 我正在尝试更新片段的UI,但runOnUiThread不起作用 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); ArrayList&

我有一个片段,它通过带有onActivityResult(…)的intent从DialogFragment获取数据

我正在尝试更新片段的UI,但runOnUiThread不起作用

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    ArrayList<Farm> farms = data.getParcelableArrayListExtra("farms_list");
    float totalArea = 0;
    for(Farm farm : farms) {
        if (farm.isSelected()) {
            Log.d("farm", farm.getName());
            totalArea += farm.getArea();
        }
    }
    final float finalTotalArea = totalArea;
    activity.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            area.setText(String.valueOf(finalTotalArea));
        }
    });
}

正在主线程上调用onActivityResult。更多由于某些原因,无法使用此方法编辑视图(可能未创建或绘制)。 您可以使用的一个技巧是设置var boolean updateTextView=false;
在onActivityResult上,将其设置为true,保存您获得的数据,然后在Resume上检查updateTextView,如果为true,则将数据设置为您的TextView。

onActivityResult在主线程上被调用。更多由于某些原因,无法使用此方法编辑视图(可能未创建或绘制)。 您可以使用的一个技巧是设置var boolean updateTextView=false;
在onActivityResult上,将其设置为true,保存您获得的数据,然后在Resume上检查updateTextView,如果为true,则将数据设置为您的TextView。

如何尝试将其包装到您随后启动的适当线程中

new Thread() {
            public void run() {
                try {
                   activity.runOnUiThread(new Runnable() {
                       @Override
                       public void run() {
                          area.setText(String.valueOf(finalTotalArea));
                       }
                   });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();

试着用一个合适的线程来包装它,然后再启动怎么样

new Thread() {
            public void run() {
                try {
                   activity.runOnUiThread(new Runnable() {
                       @Override
                       public void run() {
                          area.setText(String.valueOf(finalTotalArea));
                       }
                   });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();

似乎您的
活动
在某个地方丢失了您的
片段
,我在本例中所做的是向我的
回调
添加一个方法,可能是
重新附加对话框(DialogFragment DialogFragment)
,并使用
重新附加对话框(this)
在DialogFragment的恢复中调用它

在您的活动中,您可以这样做:

@Override
public void reattachFragment(DialogFragment dialogFragment) {
 this.dialogFragment = dialogFragment;
}
或在片段中:

@Override
public void reattachFragment(DialogFragment dialogFragment) {
 getActivity().setDialog(dialogFragment);
}

似乎您的
活动
在某个地方丢失了您的
片段
,我在本例中所做的是向我的
回调
添加一个方法,可能是
重新附加对话框(DialogFragment DialogFragment)
,并使用
重新附加对话框(this)
在DialogFragment的恢复中调用它

在您的活动中,您可以这样做:

@Override
public void reattachFragment(DialogFragment dialogFragment) {
 this.dialogFragment = dialogFragment;
}
或在片段中:

@Override
public void reattachFragment(DialogFragment dialogFragment) {
 getActivity().setDialog(dialogFragment);
}

您应该使用
getActivity.runOnUiThread(new Runnable(){
.getActivity()返回null当您说runOnUiThread()不工作时,您的意思是它会导致错误还是它不处理任何内容?它不会呈现任何内容可能重复的内容您应该使用
getActivity.runOnUiThread(new Runnable(){
.getActivity())返回Null当您说runOnUiThread()不工作时,您的意思是它导致错误还是它不处理任何内容?它不呈现任何可能重复的内容