如何在启动线程的Fragment中实现回调?

时间:2019-07-18 06:34:30

标签: android android-fragments callback

我尝试通过从线程到片段的回调来关闭ProgressDialog,但是我不知道我需要传递哪个引用。

在我的片段中,我需要执行以下操作:

 c_thread_connectToDevice = new c_Thread_ConnectToDevice(UserSelectedDevice, 
 sFinalDonglePassword, getActivity());
 if(UserSelectedDevice != null){
 c_thread_connectToDevice.start();
 mProgessDialog.setTitle(R.string.ProgressDialog_Fragmentsetpassword_Title);
mProgessDialog.setMessage(getResources().getString(R.string.ProgressDialog_Fragmentsetpassword_Message));
 mProgessDialog.setIndeterminate(true);
 mProgessDialog.show();

回调为:

public void dismissProgressDialog(){
        mProgessDialog.dismiss();

        if(!c_thread_connectToDevice.isbConnectionState()){
            tv_Fragmentsetpassword_userhint.setTextColor(getResources().getColor(R.color.Mercedes_RED, null));
            tv_Fragmentsetpassword_userhint.setText(R.string.tv_Fragmentsetpassword_ConnectionFailed);
        }else {
            tv_Fragmentsetpassword_userhint.setText(R.string.tv_Fragmentsetpassword_ConnectionSucces);
            tv_Fragmentsetpassword_userhint.setTextColor(getResources().getColor(R.color.Mercedes_GREEN, null));
        }

    }

在我的线程中,我使用以下代码:

private WeakReference<Activity> weakReference;
...
 dismissProgressDialog();
...
private void dismissProgressDialog(){
        Activity activity = weakReference.get();
        activity.dismissProgressDialog();
    }

我知道这行不通。但是,正确的做法是什么?

1 个答案:

答案 0 :(得分:0)

@Zach Bublil告诉我的是什么,使我想到了这个解决方案。

private Handler handler = new Handler(Looper.getMainLooper());
c_thread_connectToDevice = new c_Thread_ConnectToDevice(UserSelectedDevice, sFinalDonglePassword, c_Fragment_RoutineStartConnection_setpassword.this);
if(UserSelectedDevice != null){
c_thread_connectToDevice.start();
mProgessDialog = new ProgressDialog(getContext());
mProgessDialog.setTitle(R.string.ProgressDialog_Fragmentsetpassword_Title);
mProgessDialog.setMessage(getResources().getString(R.string.ProgressDialog_Fragmentsetpassword_Message));
mProgessDialog.setIndeterminate(true);
mProgessDialog.show();

回叫

public void dismissProgressDialog(){
   mProgessDialog.dismiss();
   handler.post(new Runnable() {
      @Override
      public void run() {
      if(!c_thread_connectToDevice.isbConnectionState()){
         tv_Fragmentsetpassword_userhint.setTextColor(getResources().getColor(R.color.Mercedes_RED, null));

      tv_Fragmentsetpassword_userhint.setText(R.string.tv_Fragmentsetpassword_ConnectionFailed);
       }else {
           tv_Fragmentsetpassword_userhint.setText(R.string.tv_Fragmentsetpassword_ConnectionSucces);
           tv_Fragmentsetpassword_userhint.setTextColor(getResources().getColor(R.color.Mercedes_GREEN, null));
              }
          }
        });

InsideFragment

private c_Thread_ConnectedToBluetoothDevice c_thread_connectedToBluetoothDevice;

public c_Thread_ConnectToDevice(BluetoothDevice device, String sFinalDonglePassword, c_Fragment_RoutineStartConnection_setpassword reference) {
        this.mBluetoothDevice = device;
        this.sFinalDonglePassword =sFinalDonglePassword;
        this.reference = reference;
    }
...
dismissProgressDialog();
...
 private void dismissProgressDialog(){
        reference.dismissProgressDialog();
    }

让我很难理解的是,为什么我需要在主线程上运行回调Text版本。如果我不这样做,那么“仅由原始线程创建视图...”是一个例外,但这可能是由

引起的
tools:context=".c_RoutineStartConnection"

为了更好的可用性,我在Fragment布局中使用了它。