마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

AsyncTask 상속받았을때 getApplicationContext() 오류나는 부분 도와주세요

0 추천
아래 소스코드에서

 

private ProgressDialog mDialog = new ProgressDialog(getApplicationContext());

이부분에서 getApplicationContext() 여기기 오류인데 왜그런거죠??

ㅠ.ㅠ

 

 

 

package com.example.multipartentityprogress;

import java.io.File;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;

import com.example.multipartentityprogress.CustomMultipartEntity.ProgressListener;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.os.AsyncTask;

public class TestAsyncTask extends AsyncTask<HttpResponse, Integer, Long>{

 private ProgressDialog mDialog = new ProgressDialog(getApplicationContext());
 long totalSize;
 
 protected Long doInBackground(HttpResponse... arg0) {
  
  String url = "URL 정보";
  //파라미터 등록
  Map<String, Object> params = new HashMap<String, Object>();
  //파일 파라미터 등록
  Map<String, File> fileParams = new HashMap<String, File>();
  
  try{
   
   HttpClient httpClient = new DefaultHttpClient();
   HttpContext httpContext = new BasicHttpContext();
   HttpPost httpPost = new HttpPost(url);

   CustomMultipartEntity multipart = new CustomMultipartEntity(new ProgressListener() {

    public void transferred(long transferred) {
     // TODO Auto-generated method stub
     
    }
   });

   //Params 첨부    
   for (String strKey : params.keySet()) {
    StringBody body = new StringBody(params.get(strKey).toString());
    multipart.addPart(strKey, body);
    }
   //파일첨부
   for (String keys : fileParams.keySet()) {
    multipart.addPart(keys , new FileBody(fileParams.get(keys)));
    }
   totalSize = multipart.getContentLength();
   //Time Check
   mDialog.setMax((int)totalSize);
   httpPost.setEntity(multipart);
   HttpResponse response = httpClient.execute(httpPost,httpContext);
   InputStream is = response.getEntity().getContent();
   /**     
    * is를 가지고 추가 작업
    *     
    * */
   
  }catch(Exception e){
   return 0L;
  }
  
  return 0L;
 }

 protected void onCancelled() {
  super.onCancelled();
  mDialog.dismiss();
 }

 protected void onPostExecute(Long result) {
  super.onPostExecute(result);
  mDialog.dismiss();
 }

 protected void onPreExecute() {
  super.onPreExecute();
  
  mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  mDialog.setCancelable(true);
  mDialog.setOnCancelListener(cancelListener);
  mDialog.setMessage("업로드중입니다");
  mDialog.show();
 }

 protected void onProgressUpdate(Integer... progress) {
  super.onProgressUpdate(progress);
  //Progress 업데이트
  mDialog.setProgress((int)progress[0]);
 }
 
 OnCancelListener cancelListener = new OnCancelListener() {

  public void onCancel(DialogInterface dialog) {
   
  }
 };
 

}
김기훈 (390 포인트) 님이 2013년 3월 18일 질문

2개의 답변

0 추천
getApplicationContext객체는 다이알로그를 지원하지 않습니다..

액티비티에서도 저 종류의 컨텍스트론 다이알로그 못띄웁니다 액티비티 넣으시는게 젤 좋지만

그게 힘드시면 전역변수 구현해보세요
수상한i (8,050 포인트) 님이 2013년 3월 18일 답변
0 추천
해당 AsyncTask를 호출할 때 파라메터로 context 를 넘겨서 사용하시면 됩니다. AsyncTask의 첫번째 파라메터가 Payload인데요. URL대신  (URL, context) 조합의  payload class 를 만들어서  execute 시에  context 값을 같이 넣어주면 될 것 같습니다.
juniano (310 포인트) 님이 2013년 3월 19일 답변
Payload를 어디에 어떻게 만들어야되나요?? ㅠ.ㅠ
가장 간단한 방법은 AsychTask class 안에 static class로 만드는 겁니다.
public static class Payload {
public URL mURL;
public Context mContext

  public Payload(URL url, Context context) {
    this.mURL = url;
    this.mContext = context;
  }
}
대충 요런 식으로 만들어 TestAsyncTask 내부에 선언하고
execute함수에서 static class method호출하는 방법으로 파라메터를 넘겨주시면 됩니다.
...execute(new TestAsyncTask.Payload(URL, context));
...