gpt4 book ai didi

android - 是否可以启动一个新的 Intent 并让它在单独的线程中运行?

转载 作者:行者123 更新时间:2023-11-29 22:24:18 25 4
gpt4 key购买 nike

我有点卡住了。我的应用程序中有一项 Activity 无法完成,因为它卡住了主 ui 线程。我可以在 log cat 中看到,因为它长时间没有响应,以至于它会杀死整个应用程序并关闭……这太糟糕了。

所以....我从一个菜单启动这个过程,我通过调用一个 Intent 来启动它......基本的东西。但是我正在调用的 Activity 是查询手机内部和外部的所有图像文件。我尝试在内部类中使用 AsyncTask,但这只是我对如何正确执行它的理解的一小部分。我不确定什么会回到哪里以及什么。

因此我的问题是,我是否可以只创建一个新线程以在调用 Intent 时启动并让 Activity 在其上运行?听起来这比我完成我的 Activity 并尝试使 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();

我知道 android 应该在常规线程中表现得很奇怪,但我不知道如何使用 AsyncTask,而且我找不到很多很好的深入示例。如果有人可以通过一些示例或高级教程为我阐明这一点,我将非常感激。 :)

哦,这是我试图放入 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;
}

}

最佳答案

据我了解,Activity 必须在 UI 线程上运行。您最好的选择是使用 AsyncTaskIntentService .由于您正在收集要在 UI 中使用的资源,因此我建议使用 AsyncTask(阅读 this)。

您是否在 Activity 中创建了一个扩展 AsyncTask 的内部类?如果是这样,我会说你快到了。这允许您的 AsyncTask 轻松访问 Activity 中的 View。也许如果您发布代码,我可以让您知道它需要如何重构/修复。

关于android - 是否可以启动一个新的 Intent 并让它在单独的线程中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6378621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com