Ale*_*lex 12 android android-asynctask
我想知道是否AsyncTask在MainActivity.java运行该线程的main activity()中使用了它.
例如,我注意到许多教程在使用AsyncTask它们时在主类中声明了一个私有类,Activity而不是.java为那个AsyncTask(MyAsyncTask.java)创建一个独立的文件class.
但我注意到,使用一个独立的文件,当我不能够运行runOnUIThread(),因为它属于Activity类,所以我将如何能够使用独立的内部这种方法AsyncTask(MyAsyncTask.java)延伸AsyncTask,而不是Activity.
cod*_*gic 14
那完全没问题.我经常这样做,但这取决于你如何使用它.如果它可以被其他人使用,Activities那么我给它自己的类或共享类.但如果它只是为了一个目的,那么我会把它变成一个内在的类MainActivity.
使其成为内部类的好处是它可以直接访问该类成员变量.如果你把它作为一个单独的类,那么你需要为它创建一个构造函数,如果你需要传入params一个context或其他变量.
我不确切知道你在做什么,但我不确定你是否需要runOnUiThread().您可以在AsyncTask文件中创建构造函数,并将其context作为参数和您需要的任何其他内容接受.然后你可以更新UIinonPostExecute()
例
public class MyAsyncTask extends AsyncTask{
private Context context;
public MyAsyncTask(Context context) { // can take other params if needed
this.context = context;
}
// Add your AsyncTask methods and logic
//you can use your context variable in onPostExecute() to manipulate activity UI
}
Run Code Online (Sandbox Code Playgroud)
然后在你的 MainActivity
MyAsyncTask myTask = new MyAsyncTask(this); //can pass other variables as needed
myTask.execute();
Run Code Online (Sandbox Code Playgroud)
通常我们放在AsyncTask同一个类中,以便更清楚地表明它仅由同一个活动使用.
如果您希望AsyncTask由多个活动重用,那么您可以简单地创建一个独立的类,并通过构造函数传递活动中的参数
您可以在asyncTask中创建接口,以便将asynctask的响应发送到您的活动,如下所示,并在需要时调用lister方法.我叫它onPostExecute():
public class DeckDownloader extends AsyncTask<Void, Void, String> {
OnDownloadUpdateListener listener;
public interface OnDownloadUpdateListener {
public void OnDownloadDeckFinish(String Response);
}
public DeckDownloader(Context ctx, OnDownloadUpdateListener listener) {
mContext = ctx;
this.listener = listener;
}
@Override
protected String doInBackground(Void... params) {
String str = "downloading";
//your async code goes here
return str;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(String result) {
if( listener != null ) {
listener.OnDownloadDeckProgress(result);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在您的Activity类中,您需要实现该侦听器并编写代码以在该实现方法中更新textview:
public class myActivity extends Activity{
private DeckDownloader.OnDownloadUpdateListener downloadListener;
TextView txtAsyncResponse;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
txtAsyncResponse = (TextView) findViewById(R.id.txtAsyncResponse);
downloadListener = new DeckDownloader.OnDownloadUpdateListener() {
@Override
public void OnDownloadDeckFinish(String Response) {
txtAsyncResponse.setText(Response);
}
};
}
Run Code Online (Sandbox Code Playgroud)
您可以在下面编写代码,以便在需要时在您的活动中启动AsyncTask,如按钮点击事件或其他
DeckDownloader mTask = new DeckDownloader(this.getApplicationContext(), downloadListener);
mTask.execute();
Run Code Online (Sandbox Code Playgroud)
这可能是你想要的thindg!
| 归档时间: |
|
| 查看次数: |
12205 次 |
| 最近记录: |