2016-04-23 5 views
0

私はclassにバックグラウンドタスクを実行しています。 (AppCompatActivity由来)Android:AsyncTask(doInBackground経由)からアクティビティの非静的メソッドを呼び出す方法

私の活動で
public class BackgroundTask extends AsyncTask<Void, Void, Void> 
{ 
    private ProgressDialog dialog; 

    public BackgroundTask(AppCompatActivity activity) 
    { 
     dialog = new ProgressDialog(activity); 
    } 

    @Override 
    protected void onPreExecute() 
    { 
     dialog.setMessage("Doing something, please wait."); 
     dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     dialog.setCancelable(false); 
     dialog.setProgress(0); 
     dialog.setMax(100); 
     dialog.show(); 
    } 

    @Override 
    protected void onPostExecute(Void result) 
    { 
     if (dialog.isShowing()) 
     { 
      dialog.dismiss(); 
     } 
    } 

    @Override 
    protected Void doInBackground(Void... params) 
    { 
     try 
     { 
      // How can I call non-static method of MyActivity here? 
     } 
     catch (InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 

     return null; 
    } 
} 

MyActivity時間のかかるタスクがある時はいつでも、私はこのようにそれを呼び出す:

BackgroundTask task = new BackgroundTask(MyActivity.this); 
    task.execute(); 

そして完全に罰金であるダイアログでアニメーションを待って表示されます。私は知りたいのですが、は、MyActivity(および他のアクティビティ)に属する非静的メソッド(時間を消費する)をBackgroundTaskに渡すことができるので、 `doInBackground 'から呼び出すことができますか?

ありがとうございます。

答えて

2
public class BackgroundTask extends AsyncTask<Void, Void, Void> { 

    private ProgressDialog dialog; 
    private MyActivity activity; 

    public BackgroundTask(MyActivity activity) { 
     this.activity = activity; 
     dialog = new ProgressDialog(activity); 
    } 

    ...  

    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      activity.callWhatYouNeed(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 
} 

しかし、この方法は、非メインスレッド上で実行されるので、あなたは、ビューで何もできないbecasue、あなたはdoInBackgroundの内側と呼ぶものについての世話をします。あなたが他の活動とのAsyncTaskを使用したい場合は、継承を使用してcallWhatYouNeed()

public abstract class BaseActivity extends AppCompatActivity { 

    public abstract void callWhatYouNeed(); 

} 

拡張して1 BaseActivityを作成する必要があり:あなたはビューで何かを行う必要がある場合は、この

public class BackgroundTask extends AsyncTask<Void, Void, Void> { 

    private ProgressDialog dialog; 
    private MyActivity activity; 
    private Handler uiHandler; 

    public BackgroundTask(MyActivity activity) { 
     this.activity = activity; 
     dialog = new ProgressDialog(activity); 
     uiHandler = new Handler(Looper.getMainLooper()); 
    } 

    ... 

    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      mHandler.post(new Runnable() { 
       @Override 
       public void run() { 
        activity.callWhatYouNeed(); 
       } 
      }); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

のような呼び出しがUPDATE作りますBaseActivityから:

public class MyActivity extends BaseActivity { 

    @Override 
    public void callWhatYouNeed() { 
     //Implementation 
    } 

} 

から変更し、AsyncTaskを変更してください

public class BackgroundTask extends AsyncTask<Void, Void, Void> 
{ 
    private ProgressDialog dialog; 
    private BaseActivity activity; 

    public BackgroundTask(BaseActivity activity) 
    { 
     this.activity = activity; 
     dialog = new ProgressDialog(activity); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      activity.callWhatYouNeed(); 
     } 
     catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

それとも、のinstanceof演算子での活動を確認することができます。

public class BackgroundTask extends AsyncTask<Void, Void, Void> { 

    private ProgressDialog dialog; 
    private AppCompatActivity activity; 

    public BackgroundTask(AppCompatActivity activity) { 
     this.activity = activity; 
     dialog = new ProgressDialog(activity); 
    } 

    ... 

    @Override 
    protected Void doInBackground(Void... params){ 
     try { 
      if (activity instanceof MyActivity) { 
       ((MyActivity) activity).callWhatYouNeed(); 
      } else if (acitivty instanceof SeocndActivity) { 
       ((SecondActivity) activity).secondCall(); 
      } 
     } 
     catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 
} 

しかし、instanceofを使用するために悪い習慣ですので、私は強く使用の継承をお勧めします。

+0

ためにのみ 'MyActivity'とそれを結ぶことになります。しかし、このクラスは、他のアクティビティからバックグラウンドアクティビティを実行するためにも使用されます。だから私はどのような活動から呼び出されるメソッドを探しています。 – Atul

+0

@Atul、updated answer – dewarder

+0

いくつかの 'BaseActivity'から派生した活動(待つ必要性)が良いオプションです。ありがとう! – Atul

1
BackgroundTask task = new BackgroundTask(MyActivity.this); 
task.execute(); 

この時点でMyActivityクラスで上記のコードを呼び出すと、コンストラクターでクラスのインスタンスが渡されました。したがって、MyActivityクラスから非静的メソッドを取得できます。例えば

public class BackgroundTask extends AsyncTask<Void, Void, Void>{ 
    private ProgressDialog dialog; 

    private MyActivity activity; 

public BackgroundTask(MyActivity activity) 
{ 
    this.activity = activity; 
    dialog = new ProgressDialog(activity); 
} 

@Override 
protected void onPreExecute() 
{ 
    dialog.setMessage("Doing something, please wait."); 
    dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
    dialog.setCancelable(false); 
    dialog.setProgress(0); 
    dialog.setMax(100); 
    dialog.show(); 
} 

@Override 
protected void onPostExecute(Void result) 
{ 
    if (dialog.isShowing()) 
    { 
     dialog.dismiss(); 
    } 
} 

@Override 
protected Void doInBackground(Void... params) 
{ 
    try 
    { 
     activity.callyourmethod(); 

    } 
    catch (InterruptedException e) 
    { 
     e.printStackTrace(); 
    } 

    return null; 
} 

}

+0

これは、MyActivityとだけ結びついています。しかし、このクラスは、他のアクティビティからバックグラウンドアクティビティを実行するためにも使用されます。だから私はどのような活動から呼び出されるメソッドを探しています。 – Atul

関連する問題