我做了一些简单的片段,并且知道我想从另一个线程更新内容。但是我不知道如何。 如果我要使用简单的Fragments,我可以使用接口,但就我而言,这是行不通的。
我尝试使用Bundle并在Sequene中对其进行更新,但这只能使用一次,因为我不知道如何两次调用该方法。
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
public class cf_Fragment_MainDriver1 extends Fragment {
public static final String ARGS_MainDriver1 = "ARGS_MainDriver1";
public static final String ARGS1_MainDriver1 = "ARGS1_MainDriver1";
c_Thread_Update_Fragent c_thread_update_fragent = new c_Thread_Update_Fragent();
private TextView tv_MainDriver1_counter;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_cf_fragment_main_driver1, container, false);
Bundle args = getArguments();
String arg1 = Integer.toString(args.getInt(cf_Fragment_MainDriver1.ARGS_MainDriver1));
((TextView) root.findViewById(R.id.tv_MainDriver1)).setText(arg1);
tv_MainDriver1_counter = root.findViewById(R.id.tv_MainDriver1_counter);
updateData();
return root;
}
public void updateData(){
String x;
Bundle args = getArguments();
x = Integer.toString(args.getInt(cf_Fragment_MainDriver1.ARGS1_MainDriver1));
tv_MainDriver1_counter.setText(x);
}
}
package com.example.fragmentmanagermain;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.View;
import static android.content.ContentValues.TAG;
public class c_Thread_Update_Fragent extends Thread {
private static Fragment fi;
private Bundle args;
@Override
public void run() {
int i=0;
while (true)
{
try {
args.putInt(cf_Fragment_MainDriver1.ARGS1_MainDriver1, i);
fi.setArguments(args);
Log.d(TAG, "run: Works");
}catch (NullPointerException e){
Log.d(TAG, "run: Failed");
}
i++;
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void getFragment(Fragment f){
fi =f;
}
}
package com.example.fragmentmanagermain;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
c_PagerAdapter_Driver1 c_pagerAdapter_driver1;
c_PagerAdapter_Driver2 c_pagerAdapter_driver2;
c_Thread_Update_Fragent c_thread_update_fragent = new c_Thread_Update_Fragent();
ViewPager viewPager;
Button bt_Driver1;
Button bt_Driver2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_Driver1 = findViewById(R.id.bt_Driver1);
bt_Driver2 = findViewById(R.id.bt_Driver2);
c_pagerAdapter_driver1 = new c_PagerAdapter_Driver1(getSupportFragmentManager());
c_pagerAdapter_driver2 = new c_PagerAdapter_Driver2(getSupportFragmentManager());
viewPager = findViewById(R.id.MainPager);
viewPager.setAdapter(c_pagerAdapter_driver1);
c_thread_update_fragent.start();
bt_Driver1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setFragment_Driver1();
}
});
bt_Driver2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setFragment_Driver2();
}
});
}
private void setFragment_Driver1() {
viewPager.setAdapter(c_pagerAdapter_driver1);
}
private void setFragment_Driver2() {
viewPager.setAdapter(c_pagerAdapter_driver2);
}
}
所以在这种情况下,我的问题是,如何使用第二线程的公共方法updateData()?
答案 0 :(得分:1)
基本上,可以从任何所需的线程中调用updateData()
的{{1}}方法,但是如果要更新该cf_Fragment_MainDriver1
的UI,则必须从主UI线程。
在您的情况下,您已经是名为 Fragment
的 UI 线程,然后可以调用c_Thread_Update_Fragent
方法从中(以防更新您的用户界面)。因此,要执行此操作,您必须位于 Main / UI线程上。
因此,简单的解决方案是您已经拥有updateData()
对象 fi 的实例,该实例可以使用其 Activity上下文来使您挂接到主线程>,您可以从中使用方法{strong> runOnUiThread() ,该方法以Fragment
作为参数,这就是下面的代码起作用的原因:
Runnable
答案 1 :(得分:0)
i建议使用事件总线库。这是在不同线程之间进行通信的好方法。 只需发送事件并订阅事件