функции асинхронной задачи 2, выполняющиеся в doInBackground - PullRequest
2 голосов
/ 14 марта 2012

Здравствуйте, я хочу использовать асинхронную задачу, и это мой код скелета:

public class MyActivity extends Activity {
    private ProgressDialog pd = null;
    private Object data = null;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Show the ProgressDialog on this thread
        this.pd = ProgressDialog.show(this, "Working..", "Downloading Data...", true, false);

        // Start a new thread that will download all the data
        new DownloadTask().execute("Any parameters my download task needs here");
    }

    private class DownloadTask extends AsyncTask<String, Void, Object> {
         protected Object doInBackground(String... args) {
             Log.i("MyApp", "Background thread starting");

             // This is where you would do all the work of downloading your data

             return "replace this with your data object";
         }

         protected void onPostExecute(Object result) {
             // Pass the result data back to the main activity
             MyActivity.this.data = result;

             if (MyActivity.this.pd != null) {
                 MyActivity.this.pd.dismiss();
             }
         }
    }  

Мой вопрос заключается в том, каким должен быть третий аргумент в AsyncTask, если я выполняю функцию InBackground, возвращающую как строковый массив, так ирастровое изображение?Любая помощь?

Ответы [ 2 ]

4 голосов
/ 15 марта 2012

Вы можете использовать Bundle (см. http://developer.android.com/reference/android/os/Bundle.html). Так что ваш AsyncTask будет выглядеть примерно так ...

public class MyTask extends AsyncTask<Void, Void, Bundle> 
{
  @Override
  protected Bundle doInBackground(Void... arg) 
  {
    Bundle bundle = new Bundle();
    bundle.putParcelable("Bitmap", bitmap);
    bundle.putString("String", string);

    return bundle;
  }
  protected void onPostExecute(Bundle bundle) 
  {
    Bitmap bitmap = bundle.getParcelable("Bitmap");
    String string = bundle.getString("String");
  }
}

Битовая карта является Parcelable, но вы можете столкнуться с ошибками во время выполнения для всехно самые маленькие растровые изображения. Так что вам может понадобиться превратить его в байтовый массив и обратно, что-то вроде этого ...

ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] bytes = baos.toByteArray();
Bundle bundle = new Bundle();
bundle.putByteArray("Bytes", bytes);

и это ...

byte[] bytes = bundle.getByteArray("Bytes");
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, new BitmapFactory.Options());
2 голосов
/ 14 марта 2012

Я не думаю, что есть поддержка для возврата двух вещей из AsyncTask. Вы можете использовать простой внутренний класс для хранения возвращаемых данных:

public class MyActivity ... {
   class DownloadTaskResult {
       String stringResult;
       Bitmap bitmapResult;
   }

   class DownloadTask ... extends AsyncTask<String, Void, DownloadTaskResult> {
       protected DownloadTaskResult doInBackground(String... args){
           //your work; return a DownloadTaskResult with the String and Bitmap you want
       }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...