2015-04-23 2 views
-1

У меня странная проблема. Я разрабатываю приложение для Android, которое имеет 3 независимых Async Tasks. Когда я пытаюсь запустить приложение на четырехъядерном телефоне, проблем нет. Но если я попытаюсь запустить приложение на двухъядерном телефоне, произойдет сбой. Как я могу изменить свои задачи для двухъядерных телефонов?Несколько асинхронных задач в приложении для Android

Вот мой код

OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback); 

Это первая задача асинхронной. Второй - это метод Parse.com для загрузки async saveInBackground.

public void startUpload(String fileName) { 

     try { 
      photoFile = new ParseFile(fileName, scaledData); 
      if (isTac) { 
       pictures.setPhotoFileTac(photoFile); 
      } else if (isCanak) { 
       pictures.setPhotoFileCanak(photoFile); 
      } else if (isYaprak) { 
       pictures.setPhotoFileYaprak(photoFile); 
      } 


      // pictures.save();// Telefon çekirdeğine göre 2 asenkron methodu desteklemiyor o yüzden sadece save yazılabilir fakat başarılı kontolü SaveCallback' te yakalanamaz. 




      pictures.saveInBackground(new SaveCallback() { 

       @Override 
       public void done(ParseException e) { 
        if(e == null){ 
         Toast.makeText(getApplicationContext(),"Buluta yükleme başarılı. " , Toast.LENGTH_LONG).show(); 
         if(pdialog != null) 
         { 
          pdialog.dismiss();//Eğer işlem başarılı ise asenkron sınıfta yaratılan progressbar ı kapat. 
         } 
        } 
        else{ 
         Toast.makeText(getApplicationContext(),"Hata" +e.toString(),Toast.LENGTH_LONG).show(); 
        } 
       } 
      }); 

     } 
     catch (Exception ex) 
     { 
      Toast.makeText(getApplicationContext(),"Bağlantı Hatası !",Toast.LENGTH_LONG).show(); 
     } 
    } 

И третий - индикатор выполнения процесса загрузки.

public class AsyncUpload extends AsyncTask<String,Void,String> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pdialog = new ProgressDialog(TakePictureActivity.this); 
     pdialog.setMessage("Yükleniyor..."); 
     pdialog.setIndeterminate(false); 
     pdialog.setCancelable(false); 
     pdialog.show(); 
    } 

    @Override 
    protected String doInBackground(String... fileNames) { 

     return fileNames[0]; 

    } 

    @Override 
    protected void onPostExecute(String name) { 

     startUpload(name); 

     super.onPostExecute(name); 

    } 

} 

И есть код, в котором я инициализирую загрузку. . (В, если - либо еще состояние состояний линии новый AsyncUpload() выполнение (FileName);

private void saveScaledPhoto(byte[] data) { 

    // Resize photo from camera byte array 
    pictureWidth = camera.getParameters().getPictureSize().width; 
    pictureHeight = camera.getParameters().getPictureSize().height; 
    Bitmap plantImage = BitmapFactory.decodeByteArray(data, 0, data.length); 
    Bitmap plantImageScaled = Bitmap.createScaledBitmap(plantImage, pictureWidth, pictureHeight, false); 
    pictureCache = new PictureCache(); 
    // Override Android default landscape orientation and save portrait 
    Matrix matrix = new Matrix(); 
    matrix.postRotate(90); 
    Bitmap rotatedScaledPlantImage = Bitmap.createBitmap(plantImageScaled, 0, 
      0, plantImageScaled.getWidth(), plantImageScaled.getHeight(), 
      matrix, true); 

    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    rotatedScaledPlantImage.compress(Bitmap.CompressFormat.PNG, 100, bos); 

    scaledData = bos.toByteArray(); 

    AlertDialog.Builder aDB = new AlertDialog.Builder(this); 
    aDB.setCancelable(false); 
    aDB.setTitle("Emin misiniz ?"); 
    aDB.setMessage("Çektiğiniz resim analizde kullanılacaktır. Devam etmek istiyor musunuz ?.. "); 
    aDB.setPositiveButton("Evet", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 

      if (isTac) { 

       pictureCache.setByteArrayTac(scaledData); 
       isTac = false; 
       isCanak = true; 
       Toast.makeText(getApplicationContext(), "Taç yaprak görüntüsü alındı.", Toast.LENGTH_LONG).show(); 
       String currentTimeStamp = getCurrentTimeStamp(); 
       fileName = "TacYaprak"; 

       new AsyncUpload().execute(fileName); 

      } else if (isCanak) { 


       pictureCache.setByteArrayCanak(scaledData); 
       isCanak = false; 
       isYaprak = true; 
       Toast.makeText(getApplicationContext(), "Çanak yaprak görüntüsü alındı.", Toast.LENGTH_LONG).show(); 
       String currentTimeStamp = getCurrentTimeStamp(); 
       fileName = "CanakYaprak"; 

       new AsyncUpload().execute(fileName); 
      } else if (isYaprak) { 

       String plantTag = "A_Y"; 
       pictureCache.setByteArrayYaprak(scaledData); 
       isYaprak = false; 
       Toast.makeText(getApplicationContext(), "Ağaç yaprağı görüntüsü alındı.", Toast.LENGTH_LONG).show(); 
       String currentTimeStamp = getCurrentTimeStamp(); 
       fileName = "AgacYapragi"; 

       new AsyncUpload().execute(fileName); 
      } 

      if (!isTac && !isCanak && !isYaprak) { 
       finish(); 
      } 

     } 


    }); 
    aDB.setNegativeButton("Hayır", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.cancel(); 
     } 
    }); 
    AlertDialog alertDialog = aDB.create(); 
    alertDialog.show(); 
} 

Вот выход LogCat ..

java.lang.NullPointerException 
     at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:482) 
     at com.altygtsoft.biomatch.TakePictureActivity.saveScaledPhoto(TakePictureActivity.java:202) 
     at com.altygtsoft.biomatch.TakePictureActivity.access$000(TakePictureActivity.java:45) 
     at com.altygtsoft.biomatch.TakePictureActivity$2$1$2.onPictureTaken(TakePictureActivity.java:147) 
     at android.hardware.Camera$EventHandler.handleMessage(Camera.java:855) 
     at android.os.Handler.dispatchMessage(Handler.java:107) 
     at android.os.Looper.loop(Looper.java:194) 
     at android.app.ActivityThread.main(ActivityThread.java:5371) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:525) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
     at dalvik.system.NativeStart.main(Native Method) 
+2

Пожалуйста, пост stacktra ce с ошибкой – AndroidEx

+0

Вы также разместили бы строку, в которой вы фактически выполняете AsyncTask? – beyondtheteal

+0

Вы получаете ошибку в памяти? –

ответ

0

Просто понял, что моя идея слишком велика для комментарий SO->

Что произойдет, если вы делаете следующее?

//Beware pseudo-code 
new AsyncTask<>({ 
    onPreExecute(){ 
     //keep your code from before 
     ... 
    } 
    doInBackground(Params... params){ 
     startUpload(params[0], params[1]); //minus the done() function, plus pictures? 
    } 
    onPostExecute(){ 
    //As I'm not sure where it fits in, if possible execute done() here. 
    } 
}).execute(fileName, pictures); //couldn't find the decleration of pictures, so I stole the decleration of independence instead. Also maybe you need to put pictures in there, depending on where it is and how public/static. 
+0

Спасибо за ваш вклад. Я решил сделать обработку изображений в других действиях, и в основном я прокомментировал строку OpenCV.initAsync и проблему, решенную для меня, но у моего определения AsyncTask есть проблемы, которые я знаю, но пока не вижу их :) –

Смежные вопросы