Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从AsyncTask向MainActivity返回数据的最佳方法_Java_Android_Android Activity_Android Asynctask_Static Methods - Fatal编程技术网

Java 从AsyncTask向MainActivity返回数据的最佳方法

Java 从AsyncTask向MainActivity返回数据的最佳方法,java,android,android-activity,android-asynctask,static-methods,Java,Android,Android Activity,Android Asynctask,Static Methods,我在应用程序中使用ASyncTask,通过restapi从web服务(Bitly)获取一些数据(短URL) 当ASyncTask完成时,我想将结果传回我的main活动 使用AsyncTask的onPostExecute方法将数据返回到main活动中 我读了很多关于如何做到这一点的书,似乎有两种方法 最初,我使用的是一种“WeakReference”方法,即在AsyncTask类开始时,创建对main活动的弱引用,如下所示: private class getShortURL extends As

我在应用程序中使用
ASyncTask
,通过restapi从web服务(Bitly)获取一些数据(短URL)

ASyncTask
完成时,我想将结果传回我的
main活动

使用
AsyncTask
onPostExecute
方法将数据返回到
main活动中

我读了很多关于如何做到这一点的书,似乎有两种方法

最初,我使用的是一种“WeakReference”方法,即在
AsyncTask
类开始时,创建对
main活动的弱引用,如下所示:

private class getShortURL extends AsyncTask<String, Void, String> {

    private WeakReference<MainActivity> mainActivityWeakReference;

    myASyncTask(MainActivity activity) {
        mainActivityWeakReference = new WeakReference<>(activity);
    }
{etc etc}
(请注意,
CommonFuncs.showMessage()
是我自己对toast函数的包装,以便于调用)

但是,Android Studio随后发出警告,“AsyncTask
类应该是静态的,否则可能会发生泄漏”

如果我将该方法设置为静态,则会收到一条警告,指出我想从
onPostExecute
调用的
main活动中的方法无法调用,因为它是非静态的

如果我将
MainActivity
中的方法设置为静态方法,那么它将无法访问字符串资源和任何其他非静态方法——我会选择兔子洞

如果我只是将代码从
MainActivity
中的方法移到
onPostExecute
方法中,正如您所料,情况也是如此。 所以

  • 将AsyncTask作为非静态方法真的是件坏事吗?(我的 应用程序似乎可以在AS中使用此警告,但我显然不能 希望在我的应用程序中创建内存泄漏
  • WeakReference
    appraoch实际上是一种更正确、更安全的方法吗
  • 如果使用
    WeakReference
    方法,如何创建需要在UI线程和访问字符串上运行的
    toasts
    来自
    main活动的资源等
我在某个地方读到过关于创建
接口的文章,但是有点迷路了,再也找不到了。这难道不会像
WeakReference
那样依赖
MainActivity
,这是一件坏事吗

我真的在寻找关于如何从
AsyncTask
将一些数据返回到
MainActivity
和UI线程的最佳实践指导,这是安全的,不会有内存泄漏的风险

将AsyncTask作为非静态方法真的是一件坏事吗?(我的应用程序在as中使用此警告似乎可以正常工作,但我显然不想在我的应用程序中创建内存泄漏

是的,您的视图和上下文将泄漏

旋转足够多,你的应用程序就会崩溃

WeakReference方法实际上是一种更正确、更安全的方法吗

这是一只死猪上的唇膏,这种情况下的弱引用比一个解决方案更像是一个破解,绝对不是正确的解决方案。

您所寻找的是一种事件总线形式,它来自于活动之外的内容

public class MyViewModel: ViewModel() {
    private final EventEmitter<String> testFullUrlReachableEmitter = new EventEmitter<>();

    public final EventSource<String> getTestFullUrlReachable() {
        return testFullUrlReachableEmitter;
    }

    public void checkReachable() {
        new testFullURLreachable().execute() 
    }

    private class testFullURLreachable extends AsyncTask<Void, Void, String> { 
        ... 
        @Override
        public void onPostExecute(String result) {
            testFullUrlReachableEmitter.emit(result);
        }
    }
}
您可以使用保留片段*或Android体系结构组件ViewModel

您可能需要引入观察者模式(但不一定是LiveData)

如果我使用WeakReference方法,我如何创建需要在UI线程上运行的Toast以及从MainActivity访问字符串资源等内容

不要在
doInBackground()
中运行那种东西

我真的在寻找关于如何从一个安全且不存在内存泄漏风险的异步任务中将一些数据返回到MainActivity和UI线程的最佳实践指导

最简单的方法是使用(或编写自己做同样事情的东西,由您决定),将
EventEmitter
放入
ViewModel
,然后在活动中订阅/取消订阅此EventEmitter

public class MyViewModel: ViewModel() {
    private final EventEmitter<String> testFullUrlReachableEmitter = new EventEmitter<>();

    public final EventSource<String> getTestFullUrlReachable() {
        return testFullUrlReachableEmitter;
    }

    public void checkReachable() {
        new testFullURLreachable().execute() 
    }

    private class testFullURLreachable extends AsyncTask<Void, Void, String> { 
        ... 
        @Override
        public void onPostExecute(String result) {
            testFullUrlReachableEmitter.emit(result);
        }
    }
}
将AsyncTask作为非静态方法真的是一件坏事吗?(我的应用程序在as中使用此警告似乎可以正常工作,但我显然不想在我的应用程序中创建内存泄漏

是的,您的视图和上下文将泄漏

旋转足够多,你的应用程序就会崩溃

WeakReference方法实际上是一种更正确、更安全的方法吗

这是一只死猪上的唇膏,这种情况下的弱引用比一个解决方案更像是一个破解,绝对不是正确的解决方案。

您所寻找的是一种事件总线形式,它来自于活动之外的内容

public class MyViewModel: ViewModel() {
    private final EventEmitter<String> testFullUrlReachableEmitter = new EventEmitter<>();

    public final EventSource<String> getTestFullUrlReachable() {
        return testFullUrlReachableEmitter;
    }

    public void checkReachable() {
        new testFullURLreachable().execute() 
    }

    private class testFullURLreachable extends AsyncTask<Void, Void, String> { 
        ... 
        @Override
        public void onPostExecute(String result) {
            testFullUrlReachableEmitter.emit(result);
        }
    }
}
您可以使用保留片段*或Android体系结构组件ViewModel

您可能需要引入观察者模式(但不一定是LiveData)

如果我使用WeakReference方法,我如何创建需要在UI线程上运行的Toast以及从MainActivity访问字符串资源等内容

不要在
doInBackground()
中运行那种东西

我真的在寻找关于如何从一个安全且不存在内存泄漏风险的异步任务中将一些数据返回到MainActivity和UI线程的最佳实践指导

最简单的方法是使用(或编写自己做同样事情的东西,由您决定),将
EventEmitter
放入
ViewModel
,然后在活动中订阅/取消订阅此EventEmitter

public class MyViewModel: ViewModel() {
    private final EventEmitter<String> testFullUrlReachableEmitter = new EventEmitter<>();

    public final EventSource<String> getTestFullUrlReachable() {
        return testFullUrlReachableEmitter;
    }

    public void checkReachable() {
        new testFullURLreachable().execute() 
    }

    private class testFullURLreachable extends AsyncTask<Void, Void, String> { 
        ... 
        @Override
        public void onPostExecute(String result) {
            testFullUrlReachableEmitter.emit(result);
        }
    }
}

奇怪的故事。我在活动中有这么多异步任务,从来没有收到过这样的警告。请从任务中删除你自己的祝酒词,看看这是否有什么区别。删除祝酒词没有什么区别。事实上,我在添加祝酒词之前很久就遇到过这些问题。奇怪的故事。我在活动中有这么多异步任务,从来没有收到过警告类似的。请从任务中移除你自己的祝酒词,看看这是否有什么区别。移除祝酒词没有什么区别。在fa中