片段和BroadcastReceiver在几秒钟后冻结应用程序

时间:2017-12-14 09:03:33

标签: java android broadcastreceiver android-fragmentactivity

以下是应用程序的完整代码,在完成一些工作后冻结(UI)。

这里有危险吗?

谢谢!

public class FragmentOne extends Fragment {

    private Context _context;
    private View view;
    private BroadcastReceiver broadcastReceiver;

    public FragmentOne() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        view = inflater.inflate(R.layout.fragment_fragment_one, container, false);
        setup();
        return view;
    }

    @Override
    public void onAttach(Context context)
    {
        super.onAttach(context);
        _context = context;
    }

    private void setup()
    {
        broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent i)
            {
                try
                { 
                    DLocation dLocation = (DLocation) i.getExtras().get("coordinates");

                    if (dLocation != null) {
                        Log.d("Первый фрагмент", "Применение параметров шир. сообщения к контролам окна");

                        TextView textLon = (TextView)view.findViewById(R.id.textLon);
                        textLon.setText(dLocation.Longitude);

                        TextView textLat =  (TextView)view.findViewById(R.id.textLat);
                        textLat.setText(dLocation.Latitude);

                        TextView textTime =  (TextView)view.findViewById(R.id.textTime);
                        textTime.setText(dLocation.TimeOfRequest);

                        TextView textErrors = (TextView)view.findViewById(R.id.textErrors);
                        textErrors.setText(dLocation.Errors);
                    }
                }
                catch (Exception ex)
                {                        
                    Toast.makeText(getActivity(), ex.getMessage(), Toast.LENGTH_LONG).show();
                }
            }
        };

        _context.registerReceiver(broadcastReceiver, new IntentFilter("location_update"));


    }

    @Override
    public void onResume() {
        super.onResume(); 
    }

    @Override
    public void onPause() {
        super.onPause();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();  

        if (broadcastReceiver != null) {
            _context.unregisterReceiver(broadcastReceiver);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

根本原因

我认为您正在使用第三方库来检测位置。图书馆以非常高的速度接收GPS坐标。然后,您的广播接收器将接收这些坐标。你的广播接收器正在UI线程上工作。你的应用程序冻结的原因是因为UI线程正在以非常高的速度工作。

解决方案

您的问题的解决方案在于绑定服务。您可以在android developer docs Bound Services中找到代码示例。

对于像音乐播放器这样的用例,在后台线程中播放媒体但在UI上显示播放音乐的持续时间,绑定服务可能很有用。我希望这能让你朝着正确的方向前进。