2013-03-15 3 views
1

이렇게 많은 시간을 알아 내려고 노력하면서 너무 많은 질문, 포럼, 답변을 읽었지 만 여전히 UI는 업데이트되지 않습니다.AsyncTask UI 업데이트

내 최종 목표는 사용자의 검색어를 가지고 가고, JSON으로 응답 PHP의 전대에 HttpRequest를 보내는 것입니다. 이것은 잘 작동하므로 잘 모르겠습니다.

내 문제는이 작업이 완료된 후 UI를 업데이트하는 것입니다. HTTP 결과를 얻을 수 있지만, 지금은 모든 결과가있는 청취자 등의 버튼과 같은 큰 변경을 구현하기 전에 기본 문자열로 UI를 업데이트하려고합니다. 지금은 UI에 문자열 만 추가하면됩니다.

onPreExecute()는 UI에 문자열을 추가하고 아래에 구현 된이, 어떻게 든 잘 작동합니다.

문제는 내가 말했듯이, 지금은 그냥 문자열, 테스트 (이 목록이나 뭐 결국 될 것입니다) .. onPostExecute입니다. 그것은 항상 예외를 던지는 전혀 작동하지 않습니다. 여기

public class DisplaySearchActivity extends ListActivity { 

ArrayList<String> listItems=new ArrayList<String>(); 
ArrayAdapter<String> adapter = null; 



private class updateUI extends AsyncTask<String, Void, String>{ 

    @Override 
    protected void onPreExecute() { 
     listItems.add("Retrieving Results..."); 
       // This actually works just like that 
    } 

    @Override 
    protected String doInBackground(String... message) { 
    final List<HashMap<String,String>> blist = httpSearch.search(message[0]); 
    return "It has done"; 
    } 

    @Override 
    protected void onPostExecute(String b){ 
     Log.v("ok", "shane - "+ b); 
     listItems.add("Business: "+ b); 
        adapter.notifyDataSetChanged(); 
    } 
} 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_display_search); 

    final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,listItems); 
    setListAdapter(adapter); 

    // final String message = getIntent().getStringExtra("input"); 
    final String message = "third+level"; 

    new updateUI().execute(message); 

} // end onCreate 


} 

예외

03-15 13:38:41.190: V/ok(15732): shane - It has done 
03-15 13:38:41.190: D/AndroidRuntime(15732): Shutting down VM 
03-15 13:38:41.190: W/dalvikvm(15732): threadid=1: thread exiting with uncaught exception (group=0x4142a2a0) 
03-15 13:38:41.200: E/AndroidRuntime(15732): FATAL EXCEPTION: main 
03-15 13:38:41.200: E/AndroidRuntime(15732): java.lang.NullPointerException 
03-15 13:38:41.200: E/AndroidRuntime(15732): at ie.whereis.DisplaySearchActivity$updateUI.onPostExecute(DisplaySearchActivity.java:34) 
03-15 13:38:41.200: E/AndroidRuntime(15732): at ie.whereis.DisplaySearchActivity$updateUI.onPostExecute(DisplaySearchActivity.java:1) 
03-15 13:38:41.200: E/AndroidRuntime(15732): at android.os.AsyncTask.finish(AsyncTask.java:631) 
03-15 13:38:41.200: E/AndroidRuntime(15732): at android.os.AsyncTask.access$600(AsyncTask.java:177) 
03-15 13:38:41.200: E/AndroidRuntime(15732): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
03-15 13:38:41.200: E/AndroidRuntime(15732): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-15 13:38:41.200: E/AndroidRuntime(15732): at android.os.Looper.loop(Looper.java:137) 
03-15 13:38:41.200: E/AndroidRuntime(15732): at android.app.ActivityThread.main(ActivityThread.java:4898) 
03-15 13:38:41.200: E/AndroidRuntime(15732): at java.lang.reflect.Method.invokeNative(Native Method) 
03-15 13:38:41.200: E/AndroidRuntime(15732): at java.lang.reflect.Method.invoke(Method.java:511) 
03-15 13:38:41.200: E/AndroidRuntime(15732): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
03-15 13:38:41.200: E/AndroidRuntime(15732): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
03-15 13:38:41.200: E/AndroidRuntime(15732): at dalvik.system.NativeStart.main(Native Method) 

나는 그것이 선으로 발생되는 생각입니다 :

adapter.notifyDataSetChanged(); 

하지만 난 그냥 정말 어댑터가 된 후에도, 무엇을하는지 이해가 안 돼요 많은 독서. 나는 왜 그런지 모르겠다.

listItems.add("Retrieving Results..."); 

사전 실행 작업에는 : S하지만 게시물에는없는 것.

도움이 매우 감사합니다.


고맙습니다. 해결책을 말씀 드렸습니다. 득표를 처리 할 수 ​​없다는 사과. 당신이 adapter.notifyDataSetChanged();를 호출 할 때 당신이

+0

나는 문제, 그리고 제안되었을 때 최종 ArrayAdapter와 제거에 보인다 두 번 통해 인스턴스 어댑터, 문제가 해결했다 의해 assing 는 거기 당신에게 아름다운 두뇌 감사합니다! – shanehoban

답변

1

adapter.notifyDataSetChanged();를 호출하기 전에 수정 된 목록 데이터 repass 필요 onCreate 방법.대신 모든

final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,listItems); 

사용

this.adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,listItems); 
+0

오 마이 갓이 일했습니다. 왜 그렇게했는지 설명해 주시겠습니까? 나는 정말로 이해하지 못한다. 추신. 최대한 빨리 올바른 표시를 할 것입니다 .. 편집 : ohhh 어댑터를 두 번 만들었습니다! 도! – shanehoban

+1

마지막 ArrayAdapter 어댑터가있는 oncreate u는 로컬 변수 어댑터를 만들고 어댑터 인스턴스 변수는 (Asynctask OnpostExecute에서 사용하고 있던) 클래스 시작 부분에서 null로 남았습니다.) .. 네, 편집 중이에요 :) – baboo

1

사용

DisplaySearchActivity.this.adapter.notifyDataSetChanged(); 

대신

adapter.notifyDataSetChanged();

updateUI 클래스의 onPostExecute 방법에서 어댑터 인스턴스에 액세스 할 수 어댑터는 이전 da를 사용할 것입니다. 타, 당신은

adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,listItems); 

final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,listItems); 

최종 ArrayAdapter와

0

adapter=null를 선언했기 때문에 < 15 카르마

1

당신은 인스턴스 필드 adapter을 숨기고 제거 교체하여하지 OnCreate

0

Firsty의

, 왜 당신은 당신의 어댑터는 final로 선언해야합니까? 활동이 보이지 않을 때보기를 수정하려는 것 같습니다. asynctask를 멤버 변수로 인스턴스화하고 Activity의 onStop 메서드에서 중지해야합니다. myAsyncTask.cancel (true);

1

어댑터가 null입니다. 목록에 설정 한 것은 oncreate() 때까지만 유효합니다. oncreate() 내부에서 다시 정의하지 마십시오. 단순히 .. adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,listItems);

관련 문제