[英]Returning from Asynch Task to MainActivity
我读了很多关于它的事情并尝试了很多东西,没有成功。 但它看起来并不难,所以我想我错过了一件小事。
我有2个类,一个MainActivity
和一个asynch task
类。
doInBackground
任务工作正常。 但是当它完成后,我想编程继续我的MainActivity
的某个点
protected Integer doInBackground(Void... params) {
try {
Log.d("control", "ZipHelper.unzip() - File: " + _archive);
ZipFile zipfile = new ZipFile(_archive);
for (Enumeration<? extends ZipEntry> e = zipfile.entries(); e
.hasMoreElements();) {
ZipEntry entry = (ZipEntry) e.nextElement();
unzipEntry(zipfile, entry, _outputDir);
}
} catch (Exception e) {
Log.d("control", "ZipHelper.unzip() - Error extracting file "
+ _archive + ": " + e);
setZipError(true);
}
return null;
}
protected void onPostExecute(Integer... result) {
//Here something like MainActivity.showPicture();
}
我知道我必须用onPostExecute
做一些事情,但我不知道到底是什么。
那么让我们说,我想在asynch-task
完成后在我的MainActivity
显示Toast?
使用监听器界面。
示例:
监听器接口
public interface AsyncTaskListener
{
public void onTaskComplete();
}
ZipHelper类
public class ZipHelper extends AsyncTask<Void, Void, Integer>
{
private String filename;
private AsyncTaskListener listener;
private File file;
public ZipHelper(String filename, File file, AsyncTaskListener listener)
{
this.filename = filename;
this.file = file;
this.listener = listener;
}
@Override
protected void onPreExecute()
{
//stuff here
}
@override
protected Integer doInBackground(Void... params)
{
//Background stuff here
}
@Override
protected void onPostExecute(Integer... result)
{
listener.onTaskComplete();
}
}
主要活动
public class MainActivity implements AsyncTaskListener
{
public void onCreate(Bundle savedInstanceState)
{
super(savedInstanceState);
setContentView(R.layout.main_activity);
//Your stuff
new ZipHelper(zip[0].mZipFileName, file, MainActivity.this).execute();
}
public void onTaskComplete()
{
//AsyncTask post stuff
}
}
如果没有你的呼唤一定的方法MainActivity
你不能切实在您的某一点开始MainActivity
。 AsyncTask
是允许您的调用Activity
继续运行而不是阻止UI
。 你可以做的是将一个context
传递给你的AsyncTask
并在onPostExecute()
显示Toast
public class MyTask extends AsyncTask<Void, Void ,Void> { // use whatever params you need here
private Context context;
public MyTask(Context c) {
context = c;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
Toast.makeText(context, "You did it!". Toast.LENGTH_SHORT).show();
}
并通过传递您的Context
调用它
Mytask task = new MyTask(this); //or MyActivity.this depending on where you are
task.execute(); // pass params if you need
我建议使用Activity context
而不是Toast
的Application context
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.