我正在尝试将远程URL中的字符串分配给变量。当我在运行远程URL代码后检查该变量时,该变量为空。 首先,我声明了空字符串,然后从URL提取了字符串,然后尝试将其分配给变量。字符串已获取但未分配给变量。
下面是代码
public class MainActivity extends Activity {
static String channel_uri = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new DownloadWebPageTask().execute();
if(channel_uri.isEmpty()){
Log.i("channel_text", "Empty");
}
}
private static class DownloadWebPageTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
final OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://yeshuaatv.com/channel/streamingurl/adaptive.txt")
.build();
Response response = null;
try {
response = client.newCall(request).execute();
if (!response.isSuccessful())
throw new IOException("Unexpected code " + response);
Headers responseHeaders = response.headers();
channel_uri = response.body().string();
return channel_uri;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String s) {
//tvdata.setText(channel);
// you will get data in url string
super.onPostExecute(s);
}
}
}
答案 0 :(得分:0)
问题是execute()
方法在新线程中启动Task并异步执行。这意味着在进行HTTP请求时,来自onCreate
的代码将继续运行,并且if
的检查将在请求完成之前进行。
要解决此问题,您必须等待请求完成并在那里执行代码。要使用AsyncTask
完成此操作,您可以覆盖onPostExecute
,该任务将在任务完成后在UI线程上运行。
您的代码应如下所示:
@Override
protected void onPostExecute(String channel_uri) {
if(channel_uri.isEmpty()){
Log.i("channel_text", "Empty");
}
}
这也应该删除channel_uri的类成员的用法。因为它被传递到onPostExecute
答案 1 :(得分:0)
'onCreate'和'doInBackground'在不同的线程中运行。所以这段代码
if(channel_uri.isEmpty()){
Log.i("channel_text", "Empty");
}
在您收到AsyncTask中的响应之前执行。
这就是为什么它被称为AsyncTask的原因。收到响应后,您需要在doInBackground中记录channel_uri。