Android 用于从异步任务恢复数据的回调函数

Android 用于从异步任务恢复数据的回调函数,android,asynchronous,interface,callback,Android,Asynchronous,Interface,Callback,我希望从异步任务中恢复数据,而不是直接在读取器上使用get方法,因为它会阻塞UI。因此,我实现了一个简单的接口,它提供了一个回调函数,用于传递从Url读取的数据。但当我启动应用程序时,它崩溃了。这是我的密码: MAIN ACTIVITY: public class MainActivity extends ActionBarActivity implements OnTaskComplete{ String result =

我希望从异步任务中恢复数据,而不是直接在读取器上使用get方法,因为它会阻塞UI。因此,我实现了一个简单的接口,它提供了一个回调函数,用于传递从Url读取的数据。但当我启动应用程序时,它崩溃了。这是我的密码:

      MAIN ACTIVITY:
            public class MainActivity extends ActionBarActivity implements OnTaskComplete{

                String result = null;

                @Override
                public void callBackFunction(String s) {
                    result = s;
                }

                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_main);
                    String handler = null;

                    try {
                        URL address = new URL("http://www.youth-stories.com/api/focusOnAll.php");
                        MyAsync reader = new MyAsync(this, this, handler);
                        reader.execute(address);

                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    }

                    Toast.makeText(this, handler, Toast.LENGTH_LONG).show();

                }

            }


            ASYNC TASK:

            public class MyAsync extends AsyncTask<URL, Void, String> {

                ProgressDialog dialog = null;
                Context context = null;

                private OnTaskComplete mlistener;
                private String myString;

                public MyAsync(Context context, OnTaskComplete mlistener, String contents) {
                    this.mlistener = mlistener;
                    myString = contents;
                    dialog = new ProgressDialog(context);


                }

                @Override
                protected void onPreExecute() {
                    super.onPreExecute();
                    dialog.setMessage("Loading...");
                    dialog.show();
                }

                String result = null;

                @Override
                protected String doInBackground(URL... params) {


                    try {
                        BufferedReader reader = new BufferedReader(
                                new InputStreamReader(
                                        params[0].openStream()
                                )
                        );

                        result = reader.readLine();

                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    return result;
                }

                @Override
                protected void onPostExecute(String s) {
                    super.onPostExecute(s);
                    mlistener.callBackFunction(s);
                    myString = s;
                    dialog.dismiss();
                }

            }

            INTERFACE:
            public interface OnTaskComplete {
                public void callBackFunction(String s);
            }


03-09 09:21:04.975  24825-24853/com.example.callbackdata D/OpenGLRenderer﹕ Render dirty regions requested: true
03-09 09:21:04.981  24825-24825/com.example.callbackdata D/Atlas﹕ Validating map...
03-09 09:21:05.004  24825-24858/com.example.callbackdata E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
    Process: com.example.callbackdata, PID: 24825
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
     Caused by: java.lang.SecurityException: Permission denied (missing INTERNET permission?)
            at java.net.InetAddress.lookupHostByName(InetAddress.java:451)
            at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
            at java.net.InetAddress.getAllByName(InetAddress.java:215)
            at com.android.okhttp.HostResolver$1.getAllByName(HostResolver.java:29)
            at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:232)
            at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124)
            at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:272)
            at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:373)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:323)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:190)
            at java.net.URL.openStream(URL.java:470)
            at com.example.callbackdata.MyAsync.doInBackground(MyAsync.java:44)
            at com.example.callbackdata.MyAsync.doInBackground(MyAsync.java:12)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
     Caused by: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname)
            at libcore.io.Posix.android_getaddrinfo(Native Method)
            at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55)
            at java.net.InetAddress.lookupHostByName(InetAddress.java:438)
            at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
            at java.net.InetAddress.getAllByName(InetAddress.java:215)
            at com.android.okhttp.HostResolver$1.getAllByName(HostResolver.java:29)
            at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:232)
            at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124)
            at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:272)
            at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:373)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:323)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:190)
            at java.net.URL.openStream(URL.java:470)
            at com.example.callbackdata.MyAsync.doInBackground(MyAsync.java:44)
            at com.example.callbackdata.MyAsync.doInBackground(MyAsync.java:12)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
     Caused by: android.system.ErrnoException: android_getaddrinfo failed: EACCES (Permission denied)
            at libcore.io.Posix.android_getaddrinfo(Native Method)
            at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55)
            at java.net.InetAddress.lookupHostByName(InetAddress.java:438)
            at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
            at java.net.InetAddress.getAllByName(InetAddress.java:215)
            at com.android.okhttp.HostResolver$1.getAllByName(HostResolver.java:29)
            at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:232)
            at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124)
            at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:272)
            at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:373)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:323)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:190)
            at java.net.URL.openStream(URL.java:470)
            at com.example.callbackdata.MyAsync.doInBackground(MyAsync.java:44)
            at com.example.callbackdata.MyAsync.doInBackground(MyAsync.java:12)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
03-09 09:23:57.001  25225-25225/com.example.callbackdata I/art﹕ Late-enabling -Xcheck:jni
03-09 09:23:57.174  25225-25260/com.example.callbackdata D/OpenGLRenderer﹕ Render dirty regions requested: true
03-09 09:23:57.179  25225-25225/com.example.callbackdata D/Atlas﹕ Validating map...
03-09 09:23:57.224  25225-25260/com.example.callbackdata I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:410>: QUALCOMM Build: 10/24/14, 167c270, I68fa98814b
03-09 09:23:57.225  25225-25260/com.example.callbackdata I/OpenGLRenderer﹕ Initialized EGL, version 1.4
03-09 09:23:57.237  25225-25260/com.example.callbackdata D/OpenGLRenderer﹕ Enabling debug mode 0
03-09 09:25:29.852  25621-25639/com.example.callbackdata D/OpenGLRenderer﹕ Render dirty regions requested: true
03-09 09:25:29.862  25621-25621/com.example.callbackdata D/Atlas﹕ Validating map...
03-09 09:25:29.927  25621-25639/com.example.callbackdata I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:410>: QUALCOMM Build: 10/24/14, 167c270, I68fa98814b
03-09 09:25:29.927  25621-25639/com.example.callbackdata I/OpenGLRenderer﹕ Initialized EGL, version 1.4
03-09 09:25:29.940  25621-25639/com.example.callbackdata D/OpenGLRenderer﹕ Enabling debug mode 0
主要活动:
公共类MainActivity扩展ActionBarActivity实现OnTaskComplete{
字符串结果=null;
@凌驾
public void callBackFunction(字符串s){
结果=s;
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
字符串处理程序=null;
试一试{
URL地址=新URL(“http://www.youth-stories.com/api/focusOnAll.php");
MyAsync reader=newmyasync(this,this,handler);
读卡器。执行(地址);
}捕获(格式错误){
e、 printStackTrace();
}
Toast.makeText(this,handler,Toast.LENGTH_LONG).show();
}
}
异步任务:
公共类MyAsync扩展了AsyncTask{
ProgressDialog=null;
Context=null;
私人OnTaskComplete mlistener;
私有字符串myString;
公共MyAsync(上下文、OnTaskComplete mlistener、字符串内容){
this.mlistener=mlistener;
myString=内容;
dialog=新建进度对话框(上下文);
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
setMessage(“加载…”);
dialog.show();
}
字符串结果=null;
@凌驾
受保护的字符串doInBackground(URL…参数){
试一试{
BufferedReader reader=新的BufferedReader(
新的InputStreamReader(
参数[0]。openStream()
)
);
结果=reader.readLine();
}捕获(IOE异常){
e、 printStackTrace();
}
返回结果;
}
@凌驾
受保护的void onPostExecute(字符串s){
super.onPostExecute(s);
mlistener.callBackFunction;
myString=s;
dialog.dismise();
}
}
接口:
OnTaskComplete的公共接口{
public void callBackFunction(字符串s);
}
03-09 09:21:04.975 24825-24853/com.example.callbackdata D/opengl﹕ 请求渲染脏区域:true
03-09 09:21:04.981 24825-24825/com.example.callbackdata D/Atlas﹕ 正在验证映射。。。
03-09 09:21:05.004 24825-24858/com.example.callbackdata E/AndroidRuntime﹕ 致命异常:AsyncTask#1
进程:com.example.callbackdata,PID:24825
java.lang.RuntimeException:执行doInBackground()时出错
在android.os.AsyncTask$3.done(AsyncTask.java:300)
位于java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
位于java.util.concurrent.FutureTask.setException(FutureTask.java:222)
位于java.util.concurrent.FutureTask.run(FutureTask.java:242)
在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
运行(Thread.java:818)
原因:java.lang.SecurityException:权限被拒绝(缺少INTERNET权限?)
位于java.net.InetAddress.lookupHostByName(InetAddress.java:451)
位于java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
位于java.net.InetAddress.getAllByName(InetAddress.java:215)
位于com.android.okhttp.HostResolver$1.getAllByName(HostResolver.java:29)
位于com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:232)
在com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124)上
位于com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:272)
位于com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
位于com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:373)
位于com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:323)
位于com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:190)
位于java.net.URL.openStream(URL.java:470)
位于com.example.callbackdata.MyAsync.doInBackground(MyAsync.java:44)
位于com.example.callbackdata.MyAsync.doInBackground(MyAsync.java:12)
在android.os.AsyncTask$2.call(AsyncTask.java:288)
位于java.util.concurrent.FutureTask.run(FutureTask.java:237)
在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
          ?
Caused by: java.lang.SecurityException: Permission denied (missing INTERNET permission?)
<uses-permission android:name="android.permission.INTERNET" />