繁体   English   中英

从Asynch任务返回到MainActivity

[英]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而不是ToastApplication context

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM