2011-11-05 2 views
0
package de.tablayoutexample; 

import java.util.List; 

import android.os.AsyncTask; 
import android.util.Log; 

public class CallWebServiceTask extends AsyncTask<String, String, String> { 

    private PhotosActivity theActivity; 

    public CallWebServiceTask(PhotosActivity theActivity){ 

     this.setTheActivity(theActivity); 

    } 

    @Override 
    protected void onPreExecute(){ 

     PhotosActivity.showSpinner(); 

    } 

    @Override 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 

     return PhotosActivity.getEventList(); 
    } 
    @Override 
    protected void onPostExecute(String result) { 

     List<SingleEvent> thelist = PhotosActivity.parseJSONResponse(result); 

    /*for(int i=0;i<thelist.size();i++){ 
     SingleEvent entry = thelist.get(i); 

     Log.v("Finished", entry.getTitle()); 

    }*/ 

     theActivity.refreshListView(thelist); 

     PhotosActivity.hideSpinner(); 



    } 

    public PhotosActivity getTheActivity() { 
     return theActivity; 
    } 

    public void setTheActivity(PhotosActivity theActivity) { 
     this.theActivity = theActivity; 
    } 


} 

에 사용할 수있는 AsyncTask를 클래스를 생성하지만, 그 위의 클래스가 필요한 모든 방법을 포함 내 PhotosActivity 클래스와 함께 작동 쓰기 결국 그 호출됩니다. 그러나 모든 활동에 사용할 수있는 asynctask 클래스를 만들고 싶다면 어떻게해야할까요? 내가 어떻게 그럴 수 있니? 나는 모든 PhotosActivity 유형을 "Activity"로 변경하려고 시도했지만 그게 전부 인 것처럼 보입니다.내가 뭐하는 거지 완전히 확실하지 않다 모든 활동

제 질문은이 클래스를 어떻게 동적으로 만들 수 있습니까?

편집 :

package de.tablayoutexample; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.util.Log; 

public class CustomActivity extends Activity{ 

    public String getEventList() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    public Object parseJSONResponse(String result) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    public void showSpinner() { 
     // TODO Auto-generated method stub 

    } 

    public void refreshListView(Object thelist) { 
     // TODO Auto-generated method stub 

    } 

    public void hideSpinner() { 
     // TODO Auto-generated method stub 

    } 

    public class CallWebServiceTask extends AsyncTask<String, String, String> { 

     private CustomActivity theActivity; 

     public CallWebServiceTask(CustomActivity theActivity){ 

      this.setTheActivity(theActivity); 

     } 

     @Override 
     protected void onPreExecute(){ 

      theActivity.showSpinner(); 

     } 

     @Override 
     protected String doInBackground(String... params) { 
      // TODO Auto-generated method stub 
      Log.i("ADASD","EXECUTED"); 
      return theActivity.getEventList(); 
     } 
     @Override 
     protected void onPostExecute(String result) { 

      Object thelist = theActivity.parseJSONResponse(result); 


      theActivity.refreshListView(thelist); 

      theActivity.hideSpinner(); 



     } 

     public CustomActivity getTheActivity() { 
      return theActivity; 
     } 

     public void setTheActivity(CustomActivity theActivity) { 
      this.theActivity = theActivity; 
     } 


    } 




} 

그래서 모든 것이 parseJSONResponse 방법을 제외하고 제대로 작동하는 반환 형식은 모든 활동에 대한 다를 수 있기 때문에 :

여기

은 내부 AsyncTask를 클래스를 포함 내 CustomActivity의 기본 클래스입니다

예를 들어, 내 PhotosActivity는 gson이 나를 위해 만들어주는 내 SingleEvent 개체의 List를 반환합니다.

public List<SingleEvent> parseJSONResponse(String jsonResponse) { 

     //using gson, place all the json into the SingleEvent object and then into a List 
     Type listType = new TypeToken<List<SingleEvent>>(){}.getType(); 
     List<SingleEvent> events = new Gson().fromJson(jsonResponse, listType); 


     return events; 

    } 

문제는 다음 활동이 내 값을 저장하는 데 다른 개체를 사용한다는 것입니다. 다른 객체 유형을 다루는 방법을 모르겠습니다.

답변

1

조건에주의하십시오. "동적"은로드 된 단어입니다. 이것은 기본 OOD입니다. PhotosActivity의 정적 메서드를 정기적 인 메서드로 만들고 모든 활동이 확장하는 기본 클래스를 만듭니다. AsyncTask가 호출하는 활동에는 "doWork"메소드가 있어야합니다.

이런 종류의 작업을 수행하는 더 좋은 방법이 있지만, 찾고있는 것이면 작동 할 것입니다.

1

나는 두 가지가 있습니다.

1) 인터페이스 사용을 고려하십시오. 액티비티가 특정 인터페이스를 구현하게함으로써,이를 상호 교환 적으로 사용할 수 있습니다.

2) AsyncTask에서 수행중인 작업에주의하십시오. doInBackground 메소드에서 수행 한 작업이 UI 스레드에서 사용중인 코드에 액세스하지 않도록하십시오.

관련 문제