[android] AsyncTask에서 컨텍스트 가져 오기

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"



답변

다음을 수행해야합니다.

  • 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(..);


답변

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

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
    }
  }


답변

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


답변

당신은 쓸 수 있습니다 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();
}


답변