0

Android アプリケーションに問題があります。アプリケーションはProgressDialog、計算からのデータを表示するために使用するように構築されていますが、「スリープ」は使用しません。

しかし、その計算からのデータの結果は表示されません

TextViewとListviewでデータを表示したい

メッセージエラーはonly the original thread that created a view hierarchy can touch its views

これは私のコードです:

 progressDialog = ProgressDialog.show(hasilrute.this, "","Communicating",true); 

            new Thread(new Runnable() { 
                 @Override 
                 public void run() { 
                    cariRute(tv);
                    try { 

                    } catch (Exception e) { 
                    // TODO: handle exception 
                   } 
                   handler.sendEmptyMessage(0); 
                progressDialog.dismiss(); 
                 } 
           }).start(); 
          progressDialog.dismiss(); 
           Handler handle=new Handler(){ 
                 public void handleMessage(Message msg) { 
                       super.handleMessage(msg); 
                       if(msg.what == 0) { 
                         //perform some action here................ 
                       } 
                 } 
           }; 

そして、ここに私のcariRute方法があります:

public void cariRute(TextView t){
    String haha = tv.getText().toString().toLowerCase();
    String []getAsalTujuan = haha.split("-");
    getAsal = getAsalTujuan[0];
    getTujuan = getAsalTujuan[1];
    cari(getAsal,getTujuan);


    route = new ArrayList<rute>();
    for(int i=0;i<hasilKahir.size()-1;i++){
        a = hasilKahir.get(i);
        i++;

        b = hasilKahir.get(i);
        i--;

        hitungJarak(a, b);
        System.out.println(a+b);

        List<rute> temp = new ArrayList<rute>();
        temp = getDataRute(a,b);

        /*temp = getDataRute(a,b);
        for(int j = 0; j < temp.size(); j++){
            route.add(temp.get(j));             
        }*/

    }
    List<rute> temp = new ArrayList<rute>();
    temp = filterList(listJalan);
    route = temp;

        jrk = 0;
        for(int k = 0;k<Ljrk.size();k++){

                jrk = jrk + Ljrk.get(k);
            }
        //System.out.println(jrk);
        ongkos = 0; 
        for(int l = 0;l<Longkos.size();l++){

            ongkos = ongkos + Longkos.get(l);
            //System.out.println(ongkos);
        }

        pembulatan("####.##", jrk);
        hitungOngkos(ongkos);
        System.out.println(jrk+ongkos);

    JARAK = (TextView)findViewById(R.id.textView11);
    JARAK.setText("        Jarak : "+keluaran+" km");

    ONGKOS = (TextView)findViewById(R.id.textView12);
    ONGKOS.setText("        Ongkos : Rp."+harga);

    Longkos.clear();


    for(int x = 0; x < route.size();x++){

    }
        ListAdapter adapter = new ruteListAdapter(this, (List<? extends Map<String, String>>) route,
                R.layout.list_item_2, new String[] {
                  rute.ANGKOT, rute.JALAN }, new int[] {
                  R.id.textID, R.id.textRute });
                  this.setListAdapter(adapter);
                  //db.close();

    }

この私のruteListAdapterクラス:

private List<rute> route;
private int[] colors = new int[] { 0x30ffffff, 0x30808080 };
@SuppressWarnings("unchecked")
public ruteListAdapter(Context context, 
    List<? extends Map<String, String>> route, 
    int resource, 
    String[] from, 
    int[] to) {
super(context, route, resource, from, to);
this.route = (List<rute>) route;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
int colorPos = position % colors.length;
view.setBackgroundColor(colors[colorPos]);
return view;
}

誰でも私の問題を解決するのを手伝ってもらえますか?

4

2 に答える 2

0

これを試して

progressDialog = ProgressDialog.show(hasilrute.this, "","Communicating",true); 

    new Thread(new Runnable() { 
         @Override 
         public void run() { 
            cariRute(tv);
            youActivityName.this.runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    progressDialog.dismiss();

                }
            });
            try { 

            } catch (Exception e) { 
            // TODO: handle exception 
           } 

         } 
   }).start(); 

編集

UIを更新するときはいつでももう1つ

UIスレッドを使用する

お気に入り:

yourActivityName.this.runOnUiThread(new Runnable() {
    @Override
    public void run() {
        ONGKOS.setText("        Ongkos : Rp."+harga);
    }
});
于 2012-07-05T16:13:30.057 に答える
0

作成した新しいスレッドから cariRute(tv) を呼び出していますが、これで問題ありません。ただし、cariRute() メソッド内で、TextView のテキストを変更しようとしています。この種の操作 (既存のビューの編集) は、メイン UI スレッドで実行する必要があります。バックグラウンド スレッドで実行しようとしているため、エラーが発生しています。ビューの変更が UI スレッドで発生するように、コードを変更する必要があります。

(例: cariRute(tv) 呼び出しで表示したいテキストを返して (別名、実際にテキストを変更する以外はすべて実行)、戻り値を使用して UI スレッドでテキストを設定します。)

コメントの説明に基づいて編集します。

この質問を見てください。( Android, ListView IllegalStateException: "The content of the adapter has changed but ListView does not receive a notifications" ) 基本的に、(ListAdapter を変更して) ListView の内容を編集する場合は、notifyDataSetChanged を呼び出してリストビューをデータの変更を確認することを知っています。

于 2012-07-05T16:16:44.237 に答える