2012-03-12 2 views
1

ActivityListView을 사용하고 있으며 SQLite DB에서로드하는 데 시간이 걸리므로 사용자에게 ProgressDialog이 표시되어 무언가가로드되고 있음을 알리고 싶었습니다. 별도의 스레드에서 작업을 실행하려고했지만 CalledFromWrongThreadException이 표시됩니다.AsyncThread에서 ListView 어댑터를 설정할 수 없음

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    try 
    { 
     super.onCreate(savedInstanceState); 

     requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 
     setContentView(R.layout.open_issues); 
     getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title); 

     //Set Window title. 
     final TextView title = (TextView) findViewById(R.id.customTitle); 
     if (title != null) 
      title.setText("Open Issues"); 

     //Call Async Task to run in the background. 
     new LoadIssuesTask().execute(); 
    } 
    catch (Exception e) 
    { 
     Errors.LogError(e); 
    } 
} 

그리고 LoadIssuesTask 코드 :

private class LoadIssuesTask extends AsyncTask<Void, Void, Cursor> { 

    ProgressDialog pdDialog = null; 
    protected void onPreExecute() 
    { 
     try 
     { 
      pdDialog = new ProgressDialog(OpenIssues.this); 
      pdDialog.setMessage("Loading Issues and Activities, please wait..."); 
      pdDialog.show(); 
     } 
     catch (Exception e) 
     { 
      Errors.LogError(e); 
     } 
    } 

    @Override 
    protected Cursor doInBackground(Void... params) { 
     LoadIssues(); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Cursor c) { 
     pdDialog.dismiss(); 
     pdDialog = null; 
    } 
} 

그리고 LoadIssues 코드 : IssueInfoAdapter에 대한

private void LoadIssues(){ 
    //Set listview of Issues. 
    ListView lvIssues = (ListView)findViewById(R.id.lvIssues); 
    lvIssues.setOnItemClickListener(viewIssuesListener); 

    IssueCreator = new IssueInfoCreator(this, Integer.parseInt(AppPreferences.mDBVersion)); 
    IssueCreator.open(); 
    lvIssues.setAdapter(new IssueInfoAdapter(this, IssueCreator.queryAll()));   
    IssueCreator.close(); 
} 

생성자 :

public IssueInfoAdapter(Context c, List<IssueInfo> list){ 
    mListIssueInfo = list; 

    //create layout inflater. 
    mInflater = LayoutInflater.from(c); 
} 

그것은 THR의 여기 내 주요 Activity 코드입니다 .setAdapter 메서드의 오류가 LoadIssues() 안에 있기 때문에. ERROR :

03-12 10:41:23.174: E/AndroidRuntime(11379): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: 
Only the original thread that created a view hierarchy can touch its views. 

답변

9

UI 스레드에서 실행되지 않는 doInBackground 방법의보기에 액세스하려고합니다.

@Override 
     protected List<IssueInfo> doInBackground(Void... params) { 
      IssueCreator = new IssueInfoCreator(this, Integer.parseInt(AppPreferences.mDBVersion)); 
     IssueCreator.open(); 

     IssueCreator.close(); 
     return IssueCreator.queryAll(); 

    } 

은 또한 당신의 AsyncTask를이해야한다 :

private class LoadIssuesTask extends AsyncTask<Void, Void, List<IssueInfo>> 

@Override 
    protected void onPostExecute(List<IsueInfo> items) { 
     pdDialog.dismiss(); 
     ListView lvIssues = (ListView)findViewById(R.id.lvIssues); 
     lvIssues.setOnItemClickListener(viewIssuesListener); 
     lvIssues.setAdapter(new IssueInfoAdapter(this, items)); 
    } 

하고 doInBackground 방법 : 당신은 UI 스레드에서 실행하는 방법 onPostExecute에 어댑터를 설정해야합니다

-3

에서 private void LoadIssues 메소드 호출 handler.setMessage(0)setAdapter 방법

를 사용 Handler 대신 Asynctask를 호출 할 private Handler 인스턴스를 만듭니다.

관련 문제