Textview settext并不总是在Fragment的AsyncTask中工作

时间:2015-12-15 13:13:34

标签: android android-fragments android-asynctask textview fragment

我有一个片段,我称之为asynctask获取一些数据,然后更新一些textview。

问题在于,当我第一次访问此片段时,整个过程运行良好。如果我更改为另一个片段然后返回,则textview不会通过settext更新,但如果我在更新后调用gettext,它将返回应该显示的值。

我在fragment的onCreateView中初始化textviews并在asynctask的onPostExecute中更新它们。

我希望我解释得很好..任何想法可能是什么问题?

onCreateView:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_medical, container, false);
        mContext = (FragmentActivity)getActivity();

        current_meas_data = (TextView) v.findViewById(R.id.current_measurement_data);

        bt = new MedicalBluetooth(mContext);
        return v;
    }

在onStart:

public void onStart() {
        super.onStart();


        boolean btavailable = bt.isBluetoothAvailable();
        if (btavailable == false) {
            Toast.makeText(mContext, "Bluetooth is not available",
                   Toast.LENGTH_LONG).show();
            return;
        }

        boolean btenabled = bt.isBluetoothEnabled();
        if (btenabled) {

            bt.setupService();
            bt.startService();
        } else {

            Intent enableIntent = new Intent(
                    BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableIntent, 1);
        }

        bt.setOnDataReceivedListener(new MedicalBluetooth.OnDataReceivedListener() {
            public void onDataReceived(final byte[] data, String message) {
                new GetMeasurementTask().execute(data);
            }
        });

    }

的AsyncTask:

private class GetMeasurementTask extends AsyncTask<byte[], Integer, Boolean> {

    private ProgressDialog dialog = new ProgressDialog(mContext);


    protected void onPreExecute() {
        this.dialog.setMessage("Please wait");
        this.dialog.show();
    }


    @Override
    protected Boolean doInBackground(byte[]... params) {
        com.example.bluetoothlibrary.Measurement mes = new com.example.bluetoothlibrary.Measurement();
        mes = bt.manageData(params[0]);

        return true;


    }

    protected void onPostExecute(Boolean result) {
        if (dialog.isShowing()) {
            dialog.dismiss();
        }
        if (result == true) {
            //Toast.makeText(mContext, "Call Successful!", Toast.LENGTH_LONG).show();
            Log.d("BEFORE SETTEXT",current_meas_data.getText().toString());
            current_meas_data.setText(mes.data);
            Log.d("AFTER SETTEXT",current_meas_data.getText().toString());


        }
        if (result == false) {
            //Toast.makeText(mContext, "Call Error", Toast.LENGTH_LONG).show();
        }
    }
}

日志说:

在SETTEXT之前:

在SETTEXT之后:20

但“current_meas_data”为空。

1 个答案:

答案 0 :(得分:0)

据我所知,您可能正在片段A的onCreatView中调用异步任务。因此,如果您转到片段B并按下后退按钮,片段A的onCreateView不会被触发,因为它已经在堆。为此,在片段A中的onResume()中调用AsyncTask。因此,在片段A中重写onResume并在其中调用asyncTask.execute()方法。

你肯定需要发布一些代码。