将从远程url返回的字符串分配给变量

时间:2019-02-28 11:41:37

标签: java android

我正在尝试将远程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);
    }
}

}

2 个答案:

答案 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。