Изключение на нишката на прогреса на Android

Приложението ми използва CallLog за събиране на данни и поставянето им в списък. Тъй като това отнема време, опитах се да използвам progressdialog, за да покажа на потребителя състоянието на зареждането. За съжаление (използвах progressdialog преди) eclipse ми извежда грешка: ERROR/AndroidRuntime(771): android.view.ViewRoot$CalledFromWrongThreadException: Само оригиналната нишка, която е създала йерархия на изгледи, може да докосне изгледите си.< /em>

    public class Calls extends Activity {
    //declaring variables
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.calls);

                lv1 = (ListView) findViewById(R.id.ListView01);

                pd = new ProgressDialog(Calls.this);
                pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                pd.setMessage("Loading contacts");
                pd.show();

                //Thread thread = new Thread() {  
                //public void run() {
                Calls.this.runOnUiThread(new Runnable() {

                @Override
                public void run() {

        //collecting data from CallLog, putting data into an array
    //Here comes the hard part, which is the root of the problem:


        final ArrayList<SearchResults> results = new ArrayList<SearchResults>();
             SearchResults sr1 = new SearchResults();

            for (int b=0; b<storage.length; b++)
            {
                for (int e=0; e<storage[b].length; e++)
                {
                    if (e+3 < storage[b].length)
                    {
                        arr_split_all.add(storage[b][e] + " " + storage[b][e+1] + " " + storage[b][e+2] + " " + storage[b][e+3]);
                        sr1 = new SearchResults();
                        sr1.setData1(storage[b][e+2]);
                        sr1.setData2(storage[b][e]);
                        sr1.setData3(storage[b][e+1]);
                        sr1.setData4(storage[b][e+3]);
                        sr1.setBitmap2(bitmaparray[b]);  //bitmaparray has the same size as storage, and there is no problem with this
                        results.add(sr1);
                    }
                }
            }


            lv1.setAdapter(new MyCustomBaseAdapter(Calls.this, results));  //problematic row
            handler.sendEmptyMessage(0);
            }
           };
           thread.start();
          }
    }//end of onCreate       

   private Handler handler = new Handler() {
      @Override
      public void handleMessage(Message msg) {
            pd.dismiss();
      }
  });    //ADDED a )


     }//end of class 
    //    SearchResults is another class:

            public class SearchResults extends Application{
             private String data1 = "";
             private String data2 = "";
             private String data3 = "";
             private String data4 = "";
             private String bitmap = "";
             private Bitmap bitmap2;


             public void setData1(String data1) {
              this.data1 = data1;
             }

             public String getData1() {
              return data1;
             }

            //etc...
            }

И аз използвам клас BaseAdapter, за да поставя данните на подходящите места в списъка (който се състои от изглед на изображение и четири текстови изгледа), но не мисля, че това е уместно сега.

Според Logcat проблемът е с реда lv1.setAdapter(new MyCustomBaseAdapter(Calls.this, results));. Ако прикача arraylist към listview, той работи добре. Без диалоговия прозорец за прогрес всички текстови изгледи и изгледът на изображение на всеки ред от списъка се зареждат правилно.


person erdomester    schedule 08.10.2011    source източник


Отговори (1)


Проблемът е вашето findViewById() обаждане до вашия ListView01 (и по-късно, setAdapter() обаждането). Не можете да променяте (или да осъществявате достъп) изгледи от персонализирана нишка. Това трябва да се направи в нишката на потребителския интерфейс или чрез runOnUiThread(), или на място, където се изпълнява нишката на потребителския интерфейс.

person Wroclai    schedule 08.10.2011