2012-12-31 5 views
3

AsyncTaskActivity onPostExecute() 메서드 내부에서 setadapter() 메서드를 호출하는 데 문제가 있습니다. 나는 AsyncTask : http://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute(Result에 관한 문서를 읽었지만 그것을 달성하는 방법에 대한 답을 찾지 못했다. 그렇게하기 위해 의도를 사용해야합니까? 나는 안드로이드 개발에 익숙하지 않으므로 어리석은 질문 일 경우 용서해주십시오.AsyncTask에서 UI 스레드 메서드 호출

MainActivity

public class MainActivity extends ListActivity { 

private String[] columns = new String[] {"foreign_word", "native_word"}; 
private int[] target = new int[] { R.id.foreign_word, R.id.native_word }; 
private Cursor cur = null; 

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

    new AsyncTaskActivity(this).execute(); 
} 

    public void setadapter(Cursor cur) { 
     SimpleCursorAdapter aaa = new SimpleCursorAdapter(this.getApplicationContext(), R.layout.list_entry, cur, columns, target, 0); 
     this.setListAdapter(aaa); 
    } 
} 

AsyncTaskActivity

public class AsyncTaskActivity extends AsyncTask<Void, Void, Cursor> { 

Activity activity = null; 
private SQLiteDatabase db = null; 
private String[] selection = {"_id", "native_word", "foreign_word"}; 
Cursor cur = null; 


public AsyncTaskActivity(Activity activity) { 
    this.activity = activity; 
} 

@Override 
protected Cursor doInBackground(Void... params) { 
    DbAdapter mSQLadapter = new DbAdapter(activity); 
    db = mSQLadapter.getWritableDatabase(); 
    Cursor cur = db.query("words", selection, "foreign_word='car'", null, null, null, null); 
    return cur; 
} 

protected void onPostExecute(Cursor cur) { 

// I'd like to call setadapter() ,passing it Cursor as a parameter 

    } 

} 

답변

5

당신의 AsyncTask를 항상 MainActivity에 의해 호출된다고 가정하면,이

protected void onPostExecute(Cursor cur) { 
    MainActivity mActivity = (MainActivity) activity; 
    mActivity.setadapter(); 
    } 
당신은 당신의 setAdapter 방법에 대한 더 많은 매개 변수를 지정할 수 있습니다

당신이 그렇게에서 벗어날 수 있습니다. 등

, String 배열은, 그러나 AsyncTaskMainActivity에서 호출되는 경우 더 좋은 방법은 MainActivity 안에이 AsyncTask에게 개인 내부 클래스를 만드는 것입니다. 이 그것이 당신의 접근 방식은 조금 특이 모든 전역 변수와 MainActivity

+0

AsyncTask를 MainActivity 내부의 내부 클래스가 나를 위해 작동으로하지만, 위의 코드하지 (내는, setAdapter() 메소드는 액세스 할 수 없었습니다) . – Kristopher

+0

@soulreaver mAActivity를 MainActivity의 참조로 선언하는 것을 잊어 버렸기 때문일 수 있습니다. 만약 당신이'Activity' mActivity를했다면'Activity'는'setAdapter()'메소드를 가지지 않고'MainActivity'는 그렇게하지 않기 때문에 메소드를 보지 못했을 것입니다. –

0

방법에 액세스 할 수 있습니다 만, 질문 질문에 답하려면 다음 ListActivity에

변경 activity :

ListActivity activity = null; 

을 그리고 사용

protected void onPostExecute(Cursor cur) { 
    activity.setListAdapter(new SimpleCursorAdapter(activity, R.layout.list_entry, cur, columns, target, 0)); 
} 

당신은 쇼 uld는 LoaderManager 클래스를 사용하여 백그라운드 스레드를 만들고 처리합니다. 또한 ContentProvider 사용을 고려해야하며, 바쁜 작업도 처리 할 수 ​​있습니다.

마지막으로 AsyncTaskActivity는 활동하지, 그래서이 클래스의 이름은 약간 혼란 ...

+0

LoaderManager와 Content Providers에 대해 알고 있지만, 초보자에게는 너무 복잡해 보입니다. 게다가이 솔루션 외에도 간단한 앱에 대해서는 코드 오버레이가있는 것 같습니다. – Kristopher

관련 문제