2016-04-23 89 views
0

我有一个class负责执行后台任务。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(从AppCompatActivity派生)每当有耗时的任务,我这样称呼它:

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

,然后显示在对话框中这是完全正常的等待动画。我想知道:我如何通过这个BackgroundTask属于MyActivity(和任何其他活动)的非静态方法(消耗时间),以便我可以从`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; 
    } 
} 

但约需你所说的内部doInBackground,becasue这种方法对非主线程执行,所以你不能使用视图做任何照顾。如果你需要做的,享有什么,让这样调用

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:,如果你想使用的AsyncTask与其他活动,你应该使用继承和创建一个BaseActivitycallWhatYouNeed()

public abstract class BaseActivity extends AppCompatActivity { 

    public abstract void callWhatYouNeed(); 

} 

延伸from BaseActivity

public class MyActivity extends BaseActivity { 

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

} 

and change 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,已更新答案 – dewarder

+0

从某些'BaseActivity'派生的活动(需要等待)是很好的选择。谢谢! – Atul

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

当你在MyActivity类中调用上述代码的时候你已经在constructer中的类上传递了这个实例。所以你可以从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

相关问题