0

我对 Android 中的 Thread 有疑问。我有一个带有 CheckBox 的 gridview,我想将所有图片库加载到这个 Grid 中。但我想加载这个线程。但是当我单击加载图像程序关闭时。这是我的代码。请查看并给我最好的解决方案。谢谢

Add_Image.Java :

public class add_images extends Activity implements Runnable {

    private int count;
    private Bitmap[] thumbnails;
    private boolean[] thumbnailsselection;
    private String[] arrPath;
    private ImageAdapter imageAdapter;
    private String selectImages="";
    private final ProgressDialog pd = new ProgressDialog(this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.add_images);
        pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        pd.setMessage("Please Wait...");
        pd.setIndeterminate(false);
        pd.setCancelable(true);
        pd.show();
        Thread t = new Thread(add_images.this);
        t.start();
    }

    @Override
    public void run(){
        GetList();
    }

    private void GetList() {
        try {   

            final String[] columns = { MediaStore.Images.Media.DATA,
                    MediaStore.Images.Media._ID };
            final String orderBy = MediaStore.Images.Media._ID;
            Cursor imagecursor = managedQuery(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns,
                    null, null, orderBy);
            final int image_column_index = imagecursor
                    .getColumnIndex(MediaStore.Images.Media._ID);
            this.count = imagecursor.getCount();
            this.thumbnails = new Bitmap[this.count];
            this.arrPath = new String[this.count];
            this.thumbnailsselection = new boolean[this.count];
            for (int i = 0; i < this.count; i++) {
                imagecursor.moveToPosition(i);
                final   int id = imagecursor.getInt(image_column_index);
                final   int dataColumnIndex = imagecursor
                        .getColumnIndex(MediaStore.Images.Media.DATA);
                thumbnails[i] = MediaStore.Images.Thumbnails.getThumbnail(
                        getApplicationContext().getContentResolver(), id,
                        MediaStore.Images.Thumbnails.MICRO_KIND, null);
                arrPath[i] = imagecursor.getString(dataColumnIndex);
                pd.setProgress(i);
            }
            GridView imagegrid = (GridView) findViewById(R.id.Add_Select_PhoneImageGrid);
            imageAdapter = new ImageAdapter();
            imagegrid.setAdapter(imageAdapter);
            imagecursor.close();
            pd.dismiss();

        } catch (Exception ex) {

        }
    }

Add_Image.Xml :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <Button
        android:id="@+id/btn_images_back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:minWidth="110px"
        android:text="Back To Main" android:onClick="onClick" />
    <Button
        android:id="@+id/btn_images_selected"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_toRightOf="@+id/btn_images_back"
        android:text="Select" android:onClick="onClick"/>

    <GridView
        android:id="@+id/Add_Select_PhoneImageGrid"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@id/btn_images_selected"
        android:columnWidth="90dp"
        android:gravity="center"
        android:horizontalSpacing="10dp"
        android:numColumns="auto_fit"
        android:stretchMode="columnWidth"
        android:verticalSpacing="10dp" />

</RelativeLayout>

add_view_galleryitem.xml :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ImageView
        android:id="@+id/add_view_thumbImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />

    <CheckBox
        android:id="@+id/add_view_itemCheckBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true" />

</RelativeLayout>
4

2 回答 2

0

像这样的东西

    pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    pd.setMessage("Please Wait...");
    pd.setIndeterminate(false);
    pd.setCancelable(true);
    pd.show();
new Thread(add_images.this) {
                    @Override
                    public void run() {
                           try {
                                 // code runs in a thread
                                 activity.runOnUiThread(new Runnable() {
                                        @Override
                                        public void run() {
                                               // code runs in a UI(main) thread
                                        }
                                 });
                           } catch (final Exception ex) {
                           }
                    }
             }.start();
于 2013-08-07T12:55:59.627 回答
0

如果您在崩溃时发布堆栈跟踪,这将非常有帮助。它应该显示为错误logcat

无论如何,从外观上看,您正在尝试从Android(以及许多其他 GUI 框架)不允许的单独线程更新 GUI。您只能从 GUI 线程更新 GUI。

一个简单的解决方案是调用runOnUiThread,但 Android SDK 有更好的解决方案来异步加载数据和之后更新 GUI。例如,aLoader在单独的线程中加载其数据并将结果发布到GUI 线程中LoaderCallbacks的实现。此外,当您的活动在配置更改(例如设备旋转)后重新启动和/或创建一个新实例并查询它时,它会负责恢复先前的实例。LoaderManagerLoaderLoader

对于从 加载数据的特定情况ContentResolver,例如从 MediaStore,您可以使用CursorLoader.

Android 指南对加载器如何工作以及如何使用它们有很好的解释。SDK 中也有示例项目,例如LoaderCursor示例项目。

于 2013-08-07T12:57:14.083 回答