Можно ли начать новое намерение и запустить его в отдельном потоке? - PullRequest
1 голос
/ 17 июня 2011

Я вроде застрял. У меня есть активность в моем приложении, которая просто не проходит, потому что она замораживает основной поток пользовательского интерфейса. Я вижу в журнале cat, что, поскольку он так долго не отвечает, он просто убивает все приложение и выключается .... что полностью отстой.

итак .... я запускаю этот процесс из меню и запускаю его, вызывая намерение .... базовые вещи. Но я звоню по телефону и запрашиваю у телефона все файлы изображений внутри и снаружи телефона. Я пытался использовать AsyncTask во внутреннем классе, но это не так, как я понимаю, как это сделать правильно. Я не уверен, что возвращается, где и что.

Поэтому мой вопрос: могу ли я просто создать новый поток, который будет запущен по вызову намерения, и запустить ли действие на этом? Похоже, это было бы более легким решением, чем для меня, чтобы пройти свою деятельность и попытаться заставить AsyncTask работать правильно.

Я думаю, это выглядело бы, может быть,

 Thread t = new Thread(){

        public void run(){
                    //start mark creation dialog view
        Intent intentMarkCreation = new Intent(MixView.this, MarkCreation.class);
        startActivityForResult(intentMarkCreation, 10);
                          }
                         };
        t.start();

Я знаю, что андроид должен вести себя странно с обычными потоками, но я не могу понять, как использовать AsyncTask, и я не смог бы найти много хороших подробных примеров. Если бы кто-нибудь мог пролить свет на это с помощью нескольких примеров или продвинутого учебника, я был бы очень благодарен. :)

О, вот сломанная куча кода, который я пытался вставить в асинхронную задачу

public class GraffMarkCreation extends AsyncTask {




        /*  ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
                    this, R.array.planets_array, android.R.layout.simple_spinner_item);




                   adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            fileChooser.setAdapter(adapter); */



private EditText nameMark;
private EditText describeMark;
private Spinner fileChooser;
private Button SaveMarkForLaterUpload;
private Button uploadMark;
private RadioGroup radioButtonLayout;
private ProgressBar uploadProgress;
private Gallery fileGalleryChooser;
private ImageButton goBackButton;

@Override
public void onCreate(Bundle savedInstancedState) 
{

super.onCreate(savedInstancedState);
this.setContentView(R.layout.markcreationform);
this.describeMark = (describeMark);
    findViewById(R.id.describeMark);
this.nameMark = (nameMark);
    findViewById(R.id.nameMark);
this.fileChooser = (fileChooser);
    findViewById(R.id.fileChooser);
this.SaveMarkForLaterUpload = (SaveMarkForLaterUpload);
    findViewById(R.id.SaveMarkForLaterUpload);
this.uploadMark = (uploadMark);
    findViewById(R.id.uploadMark);
this.radioButtonLayout = (radioButtonLayout);
    findViewById(R.id.radioButtonLayout);
this.uploadProgress = (uploadProgress);
    findViewById(R.id.uploadProgress);
this.fileGalleryChooser = (fileGalleryChooser);
    findViewById(R.id.fileGalleryChooser);
this.goBackButton = (goBackButton);
    findViewById(R.id.goBackButton);
 }}
 ////////////create list of images to populate the spinner view with///////////////////////
/*  class findImages extends AsyncTask<String[],String,Cursor>{

@Override
protected Cursor doInBackground(String[]... arg0) {
    // TODO Auto-generated method stub

    String[] projection = { MediaStore.Images.ImageColumns._ID,
            MediaStore.Images.ImageColumns.DATA }; 

    String selection = ""; 

    String[] selectionArgs = null; 

    Cursor mImageExternalCursor = managedQuery
(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, selection, selectionArgs,null); 

Cursor mImageInternalCursor = managedQuery(MediaStore.Images.Media.INTERNAL_CONTENT_URI, 
            projection, selection, selectionArgs, null);



     mImageExternalCursor.getString(mImageExternalCursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATA));
    mImageInternalCursor.getString(mImageExternalCursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATA));

    return mImageInternalCursor;
}

    }

    findImages findThemImages = new findImages();
    String[] params = null;
    findThemImages.execute(params);

  ////////////////////////////////////////////////////////////////////////////////////////////          


        radioButtonLayout.setOnCheckedChangeListener(this);     */



 /////Hook up radio buttons///////////////////////////////////////////////


/*

@Override
public void onCheckedChanged(RadioGroup radioButtonLayout, int buttonId) {
    // TODO Auto-generated method stub

    switch (buttonId){

    case 1:
        ///if image button selected spinner is populated with
        ///list of images to chose from

    /*  String[] projection = { MediaStore.Images.ImageColumns._ID,
                MediaStore.Images.ImageColumns.DATA }; 

        String selection = ""; 

        String[] selectionArgs = null; 

        Cursor mImageExternalCursor = managedQuery
        (MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, selection, selectionArgs, null); 

        Cursor mImageInternalCursor = managedQuery(MediaStore.Images.Media.INTERNAL_CONTENT_URI, 
                projection, selection, selectionArgs, null);

        mImageExternalCursor.getString(mImageExternalCursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATA));
        mImageInternalCursor.getString(mImageExternalCursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATA));

        */

/*      

        break;

    case 2:
        ///if audio button selected spinner is populated with
        ///list of audio files to chose from

        break;

    case 3:
        ///if video button selected spinner is populated with
        ///list of videos to chose from

        break;

    case 4:
        ///if text button selected spinner is not populated and
        ///user will be uploading only a basic mark with text only

        break;
    }

}       

Ответы [ 2 ]

1 голос
/ 17 июня 2011

Создайте новый класс (внешний открытый или внутренний закрытый), который расширяет AsyncTask , где эти значения в <> являются типами объектов. Поместите долгосрочный код в новый метод с именем public Result doInBackground(Params... params).

Создайте новый экземпляр вашей AsyncTask, задайте все необходимые значения (с помощью стандартных методов установки) (хорошая идея передать контекст основного пользовательского интерфейса), затем вызовите instance.execute(), чтобы запустить метод doInbackground. Создайте следующие методы, чтобы показать и скрыть индикатор выполнения:

ProgressDialog pdia;
protected void onPreExecute()
{
    super.onPreExecute();
    pdia = new ProgressDialog(context);
    pdia.setMessage("Loading...");
    pdia.show();

}

protected void onPostExecute(Result result)
{
    super.onPostExecute(result);
    if (context != null){
    pdia.dismiss();    
}

Прочитайте руководство, с которым связывался Гэри, и посмотрите, что я написал - все должно собраться вместе.

1 голос
/ 17 июня 2011

Насколько я понимаю, Activity должны быть запущены в потоке пользовательского интерфейса.Лучше всего использовать AsyncTask или IntentService. Поскольку вы собираете ресурсы, которые собираетесь использовать в пользовательском интерфейсе, я бы порекомендовал AsyncTask (читайте это).

Вы создали внутренний класс внутри Activity, который расширяет AsyncTask?Если так, то я бы сказал, что ты почти у цели.Это позволяет вам AsyncTask легко получить доступ к View s в Activity.Возможно, если вы отправите код, я могу сообщить вам, как его нужно реорганизовать / исправить.

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