2012-08-31 5 views
6

이 작업을하려면 꽤 오래 걸렸지 만 분명히 모범 사례는 아닙니다. 즉, AsyncTask가 끝나면 대화 상자를 표시해야하지만 getApplicationContext()가 작동하지 않으며 AsyncTask를 만들 때 매개 변수로 전달하지도 않습니다. 그래서 난 내 AsyncTask를 클래스의 컨텍스트에 대한 공용 변수를 선언하고 내가 실행 전에 설정 한 :Android AsyncTask 액티비티에 액세스하는 더 나은 방법

private OnClickListener clickLoadRefs = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Log.d("H","Clicked Load Refs"); 
     RefreshRefPoints refreshRefPoints = new RefreshRefPoints(); 
     refreshRefPoints.myCtx=v.getContext(); 
     refreshRefPoints.execute(v.getContext()); 
    } 
}; 

private class RefreshRefPoints extends AsyncTask<Context, Integer, Integer> { 

    private Integer nPoints=0; 
    public Context myCtx; 
    private ProgressDialog pd; 

    protected Integer doInBackground(Context... ctx) { 
     Log.d("H","doInBackground()"); 
     dbHelper.clearRefPoints(); 
     requestRefPoints(); 
     nPoints = parseRefPointsCSV(); 

     return nPoints; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
    } 

    protected void onPreExecute() 
    { 
     pd = ProgressDialog.show(myCtx, "Refreshing Reference Points", "Loading...", true,false); 
     Log.d("H", "onPreExecute()"); 
    } 
    protected void onPostExecute(Integer result) { 
     pd.dismiss(); 
     AlertDialog.Builder builder = new AlertDialog.Builder(myCtx); 
     builder.setTitle("Reference points refresh complete"); 
     builder.setMessage(result+" records loaded"); 
     builder.setPositiveButton("OK",null); 
     builder.show(); 
     Log.d("H","onPostExecute()");  
    }...etc 

이 사람이 바로 나에게 상황을 전달하는 적절한 방법을 보여줄 수 있습니까?

private OnClickListener clickLoadRefs = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Log.d("H","Clicked Load Refs"); 
     RefreshRefPoints refreshRefPoints = new RefreshRefPoints(Your_ActivityName.this); 
     refreshRefPoints.myCtx=v.getContext(); 
     refreshRefPoints.execute(v.getContext()); 
    } 
}; 


private class RefreshRefPoints extends AsyncTask<Void, Integer, Integer> { 

    private Integer nPoints=0; 
    public Context myCtx; 
    private ProgressDialog pd; 

public RefreshRefPoints (Context ctx) { 
    myCtx = ctx; 
} 

답변

12

등 생성자

감사

+1

하지만 메모리 누수가 발생합니다 –

2

패스 컨텍스트 생성자 메소드를 정의하고 컨텍스트 파라미터를 전달한다. 더 좋을거야.

내가 의미가 여기에 무엇을 :

전부
private class RefreshRefPoints extends AsyncTask<Void, Integer, Integer> { 

    private Integer nPoints=0; 
    private Context myCtx; 
    private ProgressDialog pd; 

    public RefreshRefPoints(Context ctx){ 
     // Now set context 
     this.myCtx = ctx; 
    } 

} 

.

+0

고마워요.하지만 doInBackground가 이클립스에서 불만을 제기하고 있습니다. 이제 샘플마다 "AsyncTask "으로 변경했습니다. –

+1

put ** Void ** in protected Integer doInBackground (** Void ** ...) { –

+0

파편으로 모든 것을하는 현대적인 맥락에서이 답변의 가치는 저하되고 있습니다. – ed209

10

Context을 참조하려면 YourActivityName.this을 사용할 수도 있습니다. Activites는 Context를 확장하므로 유효합니다.

+0

고맙습니다 - 몰랐습니다! –

+1

활동이 인스턴스화되거나 죽지 않으면이 응답에서 코드를 호출하면 NullPointerException이 발생합니다. –