我正在与团队合作,我正在做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线程完成,但我不知道如何解决这个问题。有没有人对我有任何建议?
答案 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);
}