2011-07-22 1 views
1

に結合しないので、私のコードは、logcatにポップアップ表示エラーがCalledFromWrongThreadExceptionでうまく実行しているようです。デバッグでは、バックグラウンドスレッドで実行されているハンドラも表示されます。バックグラウンドスレッドではなくメインスレッドにバインドするハンドラを取得するにはどうすればよいですか?私はちょうどメインスレッドでハンドラを作成しなければならないと思ったが、私は間違っていると思う。これをどうやって解決するのですか?私の経験でハンドラは、メインスレッド

//Imports are included 
public class DirectoryActivity extends ListActivity { 
    private ProgressDialog ProgressDialog = null; 
    private ArrayList<DirectoryListing> listing = null; 
    private DirectoryAdapter adapter; 
    private Runnable viewOrders; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.directory); 
    final Handler handler = new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 


      if (listing != null && listing.size() > 0) { 
       adapter.notifyDataSetChanged(); 
       for (int i = 0; i < listing.size(); i++) 
        adapter.add(listing.get(i)); 
       Log.e("log_tag", "\nStill running\n"); 
      } 
      ProgressDialog.dismiss(); 
      adapter.notifyDataSetChanged(); 

     } 

    }; 
    listing = new ArrayList<DirectoryListing>(); 
    adapter = new DirectoryAdapter(this, R.layout.rows, listing); 
    setListAdapter(adapter); 
    ProgressDialog = ProgressDialog.show(DirectoryActivity.this, "Please wait...", "Retrieving data ...", true); 
    viewOrders = new Runnable() { 
     @Override 
     public void run() { 
      listing = PreparePage.getArrayList(); 
      handler.handleMessage(null); 
     } 
    }; 
    Thread thread = new Thread(null, viewOrders, "Background"); 
    thread.start(); 




} 


private static class PreparePage { 
    protected static ArrayList<DirectoryListing> getArrayList() { 

     ArrayList<DirectoryListing> listings = new ArrayList<DirectoryListing>(); 
     JSONObject information = GetPageData.getJSONFromURL(url); 
     Iterator key = information.keys(); 

     while (key.hasNext()) { 
      String id = (String) key.next(); 
      JSONObject info = null; 
      try { 
       info = information.getJSONObject(id); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      String name = "", title = "", photo = ""; 
      try { 
       name = info.get("firstName") + " " + info.get("lastName"); 
       title = info.getJSONObject("position").getString("name"); 
       photo = info.optString("photoPath", "none"); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      listings.add(new DirectoryListing(name, title, photo)); 

     } 
     return listings; 
    } 
} 

}

答えて

1

は、私がなぜこれはあなたが見ているエラーを引き起こすかわからないが、これは私が代わりにAsyncTaskのハンドラとスレッドを使用する場合、それがセットアップされている方法ですhandler.sendEmptyMessage(0);代わりのhandler.handleMessage(null);

を呼び出してみてください。そして、私はこのようなエラーを見たことがない。

@グエンが正しいですが、AsyncTaskはこれらのタイプのものを処理するための好ましい方法です。そして、実際には、それをはるかに容易にします。

AsyncTask docs

AsyncTask Example

+0

それは壊れてからそれを停止し、よく変更する、ありがとう!今私は何も見ていない理由を理解しなければなりません。 – Collecter

1

、あなたがバックグラウンドで何かをするAsyncTaskクラスを拡張する独自のクラスを作成する必要があります。これは、thread +ハンドラを使用するより簡単で効果的です。

+0

私はAsyncTaskが動作するようになってみましたが、問題の同じ種類を経験していました。他の誰かが助けることができるのを待っている間に私はもう一度やり直してくれると思う。 – Collecter

+0

AsyncTaskで作業したときのコードはどうでしたか? –

+0

残念ながら、そのバージョンのバックアップを見つけることができないので、私は言うことができません。 – Collecter

関連する問題