2013-08-07 20 views
0

我在Android中遇到線程問題。我有一個GridView與CheckBox,我想加載所有圖像庫到這個網格。但我想加載這個線程。但是當我點擊加載圖像程序關閉。這是我的代碼。請看看並給我最好的解決方案。由於在Android中使用線程將所有電話圖像加載到GridView中使用線程

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> 
+1

發佈stacktrace。你是從線程更新ui嗎? 'imagegrid.setAdapter(imageAdapter);'。你會得到例外。 – Raghunandan

+0

@Raghunandan這似乎確實如此:在他的'onCreate'中有'new Thread(add_images.this)'。 –

+0

使用'runonUiThread'來更新ui,否則你會從錯誤的線程異常中調用只有原始線程.... – Raghunandan

回答

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(); 
0

如果您在崩潰時發佈堆棧跟蹤,它確實會有所幫助。它應該在logcat中顯示爲錯誤。

無論如何,從它的外觀來看,您正試圖從單獨的線程更新GUI,其中不允許通過Android(以及許多其他GUI框架)更新GUI。您只能從GUI線程更新GUI。

一個簡單的解決方案就是調用runOnUiThread,但Android SDK有更好的解決方案,用於異步加載數據並在之後更新GUI。例如,Loader將一個Loader的數據加載到單獨的線程中,並在GUI線程中將結果張貼到LoaderCallbacks實現。此外,LoaderManager負責在配置更改(例如設備旋轉)和/或創建新的Loader並重新查詢後重新啓動活動時恢復先前的實例Loader

對於從ContentResolver(例如從MediaStore)加載數據的特定情況,可以使用CursorLoader

Android guides有一個優秀說明如何加載程序工作,以及如何使用它們。 SDK中還有示例項目,例如LoaderCursor示例項目。