AsyncTask问题

时间:2014-06-29 19:41:41

标签: android android-activity android-asynctask

我正在阅读AsyncTask的内容。这对我来说是可以理解的,但我脑子里立刻想出了两个问题:

假设我有一个类和一个接口:

public MyInterface<T>
{
    void done(T result);
}

public MyActivity extends Activity implements MyInterface<String>
{
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        R.getViewByID(R.....);

        //...

        beginTask(urls);
    }

    private void beginTask(URL[] urls)
    {
        ATask task = new ATask(this);
        task.execute(urls);
    }

    @Override
    void done()
    {
        System.out.println("done!");
    }
}

AsyncTask类:

public ATask extends AsyncTask<URL, Void, String>
{
    MyInterface<String> handler = null;
    private StringBuilder fetchedResult = new StringBuilder();

    ATask(MyInterface<T> handler)
    {
        this.handler = handler;
    }

    @Override
    protected String doInBackGround(URL urls...)
    {
        URL url = urls[0];
        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet(url.toString());
        ResponseHandler<String> handler = new BasicResponseHandler<String>();

        String result = null;

        try
        {
            result = client.execute(request, handler);
            fetchResult.append(result);
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        catch(ClientProtocolException e)
        {
            e.printStackTrace();
        }
        finally
        {
            client.getConnectionManager().shutdown();
        }
        return fetchResult.toString();
    }

    @Override
    protected void onPreExecute()
    {
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(String result)
    {
        super.onPostExecute(result);
        handler.done(result);
    }
}

一切都很好。但是我遇到的担忧是:

  

1。)

     

如果由于某些原因调用Activity的{​​{1}}(MyActivity)会怎样   (AsyncTask)被破坏,ATask完成,然后调用done();在被破坏的活动中?我们怎么能阻止   这种情况发生或有没有办法重新创建被破坏的   ATask?这里最好的做法是什么?

     

2。)

     

另一种情况:如果后台任务需要很长时间(即使有意),该怎么办?   Activity中的应用程序已不在视图中?它会不会继续坚持下去   为了内存的原因(即,当需要调用onStop()时)应该销毁Activity(MyActivity),这个Activity(MyActivity)的引用时间很长?

2 个答案:

答案 0 :(得分:1)

在这两种情况下,您都必须覆盖应用程序onDestroy或activity onStop方法并调用task.cancel()。所以你需要继续引用你的任务对象。

答案 1 :(得分:0)

1。)根据文件:

onStop() - &gt;当活动不再对用户可见时调用,因为另一个活动已经恢复并且正在覆盖此活动。

ondestroy() - &gt;在您的活动被销毁之前收到的最后一个电话。这可能是因为活动正在完成(有人称为finish(),或者因为系统暂时销毁此活动实例以节省空间

因此,您需要决定何时致电task.cancel(),这可能取决于您的业务逻辑。

2。)根据文档AsyncTask应该用于仅运行几秒钟的操作。每当AsyncTask / Thread正在运行且您的活动被破坏时,内存就会泄露,因为它们仍然保留您的活动的引用。为避免任何泄漏,请将AsyncTask / Thread声明为私有静态内部类,并在onDestroy()中将t.close关闭您的主题,如果是AsyncTask将您的活动设置为null mActivity = null,因此在这两种情况下,您的活动现在都有资格进行垃圾回收。