Невозможно правильно выполнить вычисления в фоновом режиме. Использование Services / AsyncTask - PullRequest
0 голосов
/ 17 апреля 2020

Это код приложения в стадии разработки. Тема: пользователь выбирает максимум 50 изображений, затем отображает эти изображения в разных макетах. Эти макеты могут состоять в том, что один макет состоит из 6 изображений ... вторых 5 ... так что 50 изображений будут показаны в разных макетах. Проблема в том, что когда-либо служба выполняется. Иногда он плавно работает и возвращает информацию о макете. Иногда система просто приостанавливает текущее выполнение работающей службы, и результат не возвращается. Я использовал Intent Service для обработки информации в рабочем потоке, но иногда информация обрабатывается, иногда система просто пропускает текущую обработку службы.

MainActivity. java

<code>

    onActivityResult()
    {
    //...
    //..
    //..
    //..
    //..
    //MasterImageList is basically the retrieved images with their local path as string
    val myService = Intent(this,LayoutsProcessing::class.java)
                                myService.putExtra("masterImageList",masterImageList)
                                startService(myService)
    }

    override fun onResume() {
            super.onResume()
            Log.d("MyTag","On Resume")
            LocalBroadcastManager.getInstance(applicationContext).registerReceiver(mReceiver,
                IntentFilter(LAYOUTS_PROCESSING_RESULT)
            )
        }

        override fun onPause() {
            super.onPause()
            Log.d("MyTag","On Pause")
            LocalBroadcastManager.getInstance(applicationContext).unregisterReceiver(mReceiver)
        }

<code>

// Receiver


    private var mReceiver = object : BroadcastReceiver() {
            override fun onReceive(contxt: Context?, intent: Intent?) {
                if(intent!=null) {
                    if(intent.hasExtra("map")){
                        val result:HashMap> =
                            intent.getSerializableExtra("map") as HashMap>;
                        val multiCollageIntent = Intent(applicationContext, DisplayAlbumCollage::class.java)
                        multiCollageIntent.putExtra("map", result)
                        val myService = Intent(applicationContext,LayoutsProcessing::class.java)
                        multiCollageIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                        stopService(myService)
                        startActivity(multiCollageIntent)
                        finish()
                    }
                    else{
                        Toast.makeText(applicationContext,"I am g=hit",Toast.LENGTH_SHORT).show()
                    }
                }
            }
        }

</code>

LayoutsProcessing. java


    public class LayoutsProcessing extends IntentService {

        private static final String TAG = "MyTag";
        public static final String LAYOUTS_PROCESSING_RESULT = "LayoutsProcessingResult";

        private String[] masterImageList;
        int totalImageSize;

        HashMap> result = new HashMap();

        public LayoutsProcessing() {
            super("LayoutsProcessing");
            setIntentRedelivery(true);
        }

        @Override
        public void onCreate() {
            Log.d(TAG, "onCreate: ");
            super.onCreate();
        }

        @Override
        protected void onHandleIntent(@Nullable Intent intent) {
            if(intent!=null) {
                masterImageList = intent.getStringArrayExtra("masterImageList");
                totalImageSize = masterImageList.length;
            }
        }

        private void sendResultToUI(HashMap> result) {
            Intent intent = new Intent(LAYOUTS_PROCESSING_RESULT);
            intent.putExtra("map",result);
            LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);
        }

        @Override
        public void onDestroy() {
            Log.d(TAG, "onDestroy: ");
            super.onDestroy();
        }

        private HashMap> makeCollageMapForViewPager(ArrayList pageNumberSize) {
            HashMap> collageMap  = new HashMap>();
            int startIndex = 0;
            int i = 0;
            try {
                for(Integer pageSize: pageNumberSize ) {
                    int getTotalCollageImages = pageSize;
                    int end = startIndex + getTotalCollageImages;
                    int arraySize = end - startIndex;
                    ArrayList images = new ArrayList(arraySize);
                    for (int k=startIndex; k> generateRandomLayouts(int totalImageListSize)
        {
            ArrayList pageNumberSize = new ArrayList();
            int remainingImagesSize= totalImageListSize;
            int randomNumber;
            Random r = new Random();
            randomNumber = r.nextInt(7 - 2) + 2;
            int totalNumberOfPages = 0;
            while (remainingImagesSize != 0) {
                if (randomNumber > remainingImagesSize) {
                    randomNumber = r.nextInt(7 - 2) + 2;
                } else {
                    remainingImagesSize -= randomNumber;
                    Log.d("MyTag Page Number", String.valueOf(totalNumberOfPages));
                    pageNumberSize.add(randomNumber);
                    totalNumberOfPages++;
                    randomNumber = r.nextInt(7 - 2) + 2;
                }
            }
            return makeCollageMapForViewPager(pageNumberSize);
        }
    }

</code>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...