0

Android の Thread に問題があります。私は CheckBox のあるグリッドビューを持っていて、すべての画像ギャラリーをこのグリッドにロードしたいです。しかし、私はこのスレッドをロードしたい。しかし、画像の読み込みプログラムをクリックすると閉じます。これは私のコードです。見て、私に最善の解決策を教えてください。ありがとう

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 を更新するためのはるかに優れたソリューションがあります。たとえば、Loaderデータを別のスレッドにロードし、結果をGUI スレッドLoaderCallbacksの実装にポストします。さらに、構成の変更 (デバイスのローテーションなど) 後にアクティビティが再開されたときに以前のインスタンスを復元したり、新しいインスタンスを作成してクエリを実行したりします。LoaderManagerLoaderLoader

ContentResolverMediaStore などのからデータをロードする特定のケースでは、 を使用できますCursorLoader

Android ガイドには、ローダーがどのように機能し、どのように使用できるかについての優れた説明がありますSDK には、サンプル プロジェクトなどのLoaderCursorサンプル プロジェクトもあります。

于 2013-08-07T12:57:14.083 に答える