AsyncTask에서 컨텍스트 가져 오기


83

Opciones (이 클래스는 해당 작업을 호출하는 유일한 클래스 임)라는 클래스의 AsyncTask에서 컨텍스트를 가져 오려고하는데 어떻게해야하는지 모르겠습니다. 다음과 같은 코드를 보았습니다.

      protected void onPostExecute(Long result) {

    Toast.makeText(Opciones.this,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show(); 
}

그러나 그것은 나를 위해 작동하지 않습니다. "No enclosing instance of the type Opciones in scope"


4
Opciones는 활동입니까? 그렇지 않은 경우, 해당 클래스에 컨텍스트를 통과 한 다음에 그것을 사용할 필요가AsyncTask
의 Torben Kohlmeier

이것은 답변처럼 보입니다. stackoverflow.com/questions/45653121/…
Mangesh

답변:


176

다음을 수행해야합니다.

  • AsyncTask 를 사용하려면 다른 클래스에서 MyCustomTask 라고 확장하십시오 .
  • 새 클래스 생성자에서 Context 전달

public class MyCustomTask extends AsyncTask<Void, Void, Long> {

    private Context mContext;

    public MyCustomTask (Context context){
         mContext = context;
    }

    //other methods like onPreExecute etc.
    protected void onPostExecute(Long result) {
         Toast.makeText(mContext,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show(); 
    }
}

그리고 다음과 같이 클래스를 인스턴스화하십시오.

MyCustomTask task = new MyCustomTask(context);
task.execute(..);

36
훨씬 더 피하기 메모리 누수에 WeakReference를 비 중첩 또는 정적 클래스를 사용하고 mContext를 유지하는 것입니다 참고
BamsBamx

8
중첩 된 정적 클래스 던져 메모리 누수 경고에 컨텍스트를 잡고
아미르 호세인 가세

2
또한 중첩 클래스에 비 정적 클래스를 보유하면 전체 클래스 메모리 누수가 발생합니다. 경고! 그래서 우리는 메모리 누수없이 컨텍스트를 사용해야합니다!?
Amir Hossein Ghasemi

1
메모리 누수를 해결하는 방법을 찾으십시오. 컨텍스트는 WeakReference 클래스 여야합니다.
Amir Hossein Ghasemi

이것은 중첩 된 정적 클래스가 아닙니다. 공용 클래스와 활동을 별도로 정의해야합니다. 그러나 예, 더 안전한 측면을 위해 WeakReference를 사용할 수 있습니다.
Chintan Rathod

59

호스트 활동에 대한 약한 참조를 보유하면 메모리 누수를 방지 할 수 있습니다.

static class MyTask extends AsyncTask<Void, Void, Void> {
    // Weak references will still allow the Activity to be garbage-collected
    private final WeakReference<Activity> weakActivity;

    MyTask(Activity myActivity) {
      this.weakActivity = new WeakReference<>(myActivity);
    }

    @Override
    public Void doInBackground(Void... params) {
      // do async stuff here
    }

    @Override
    public void onPostExecute(Void result) {
      // Re-acquire a strong reference to the activity, and verify
      // that it still exists and is active.
      Activity activity = weakActivity.get();
      if (activity == null
          || activity.isFinishing()
          || activity.isDestroyed()) {
        // activity is no longer valid, don't do anything!
        return;
      }

      // The activity is still valid, do main-thread stuff here
    }
  }

1
활동 (asyntask 중지 및 재개)간에 전환 한 다음 다시 돌아올 때 약 참조가 여전히 활성 상태입니까?
D4rWiNS

1
myActivity를 전달하는 대신 weakReference를 클래스에 전달하는 이점이 있습니까?
seekStillness

1
@seekingStillness Weak 참조는 여전히 활동이 가비지 수집되도록 허용하여 메모리 누수를 방지합니다.
Sai

13

Activity이 작업은 하나만 사용하므로 내부 클래스로 만드십시오.Activity

public class Opciones extends Activity
{
     public void onCreate()
     {
         ...
     }

    public class MyTask extends AsyncTask<>
    {
        ...

         protected void onPostExecute(Long result) {
        Toast.makeText(Opciones.this,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show(); 
     }
}

그런 다음의 멤버 변수에 접근해야 Activity하고를Context


2
Lint는 AsyncTask 클래스가 정적이 아닌 경우 메모리 누수에 대한 경고를 표시합니다.
SapuSeven

@SapuSeven 이것은 단지 경고 일뿐임을 기억하십시오 . 나는 개인적 AsyncTask으로 단기 운영 및 종종 Activity. onPause()아직 실행중인 경우 취소하는 것이 좋습니다 . 내가 틀렸을지도 모르지만 항상 그것에 대한 내 생각이었습니다. 여기에 주제에 대한 추가 정보가 있습니다.
codeMagic

-6

당신은 쓸 수 있습니다 getApplicationContex(). 또는 전역 변수를 정의합니다.

Activity activity;

그리고 onCreate()기능에서

activity = this;

그때,

 protected void onPostExecute(Long result) {

    Toast.makeText(activity,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show(); 
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.