如何在UI

时间:2017-08-01 20:20:16

标签: android node.js multithreading android-asynctask server

我正在与团队合作,我正在做Android应用程序的服务器部分。我使用AsyncTask创建新的线程来连接服务器。问题是我不知道如何在UI线程中等待我从AsyncTask获得的变量。

这是应该从Server获取字符串的扩展类类。

package com.example.mdundic.test;

import android.os.AsyncTask;
import android.util.Log;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import static android.content.ContentValues.TAG;

public class GetJSONTask extends AsyncTask<String, Void, String> {
public interface AsyncResponse {
    void processFinish(String output);
}
public AsyncResponse delegate = null;
public GetJSONTask(AsyncResponse delegate){
    this.delegate = delegate;
}
@Override
protected void onPreExecute() {
//    super.onPreExecute();
    Log.d(TAG, "AsyncClic PreExecute ! ");
}

@Override
protected String doInBackground(String... params) {
 //   Log.d(TAG, "AsyncClic");
    return get(params[0]);
}
@Override
protected void onPostExecute(String result) {
    //super.onPostExecute(result);
    delegate.processFinish(result);
    Log.d(TAG, "AsyncClic PostExecute ! ");
}

public String get(String Url) {
    String json="";
    try {
        URL url = new URL(Url);

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Accept", "application/json");

        if (conn.getResponseCode() != 200) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + conn.getResponseCode());
        }

        BufferedReader br = new BufferedReader(new InputStreamReader(
                (conn.getInputStream())));

        String output;

        while ((output = br.readLine()) != null) {
            json += output;
        }

        conn.disconnect();

    } catch (MalformedURLException e) {

        e.printStackTrace();

    } catch (IOException e) {

        e.printStackTrace();

    }
    return json;
}

在UI主要活动中,我创建了这个类的实例并在其上调用execute,在processFinish函数中,我将输出字符串的值设置为我的全局字符串,命名为&#34; ret&#34;。

它的外观如下:

public String ret;
public String recieveServer(String URL) {
            //receive
            GetJSONTask getJSONTask = new GetJSONTask(new GetJSONTask.AsyncResponse() {
                @Override
                public void processFinish(String output) {
                    ret = output;
                }
            });
            getJSONTask.execute(URL);
            return ret;
        }

我的队友想要解析他得到的字符串。这个函数返回null,我知道这是因为UI线程不等待AsyncTask线程完成,但我不知道如何解决这个问题。有没有人对我有任何建议?

1 个答案:

答案 0 :(得分:0)

由于您已经实现了回调接口,即AsyncResponse所以不是从receiverServer()函数返回值,而只是在'processFinish()'函数中执行您的任务

public void recieveServer(String URL) {
        //receive
        GetJSONTask getJSONTask = new GetJSONTask(new GetJSONTask.AsyncResponse() {
            @Override
            public void processFinish(String output) {
                // perform you task here
                //for ex : call your function or display the output here
                //
            }
        });
        getJSONTask.execute(URL);
    }