Java 将HTTP GET代码放入Android活动时没有响应

Java 将HTTP GET代码放入Android活动时没有响应,java,android,httprequest,httpresponse,Java,Android,Httprequest,Httpresponse,我正在尝试编写一个应用程序,它涉及一个向网页发送GET请求的活动,获取代码作为响应,然后将其解析为一个特定字符串(获胜者的姓名)。当我在终端上以独立Java代码的形式运行它时,它就可以正常工作了。不过,将其应用到Android活动中不会产生任何结果:既不会成功,也不会出错 以下是主要活动的代码: package com.projects.appbrewers.swaghrwtracker; package com.example.myprojects.myapp; import androi

我正在尝试编写一个应用程序,它涉及一个向网页发送GET请求的活动,获取代码作为响应,然后将其解析为一个特定字符串(获胜者的姓名)。当我在终端上以独立Java代码的形式运行它时,它就可以正常工作了。不过,将其应用到Android活动中不会产生任何结果:既不会成功,也不会出错

以下是主要活动的代码:

package com.projects.appbrewers.swaghrwtracker;

package com.example.myprojects.myapp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MainActivity extends AppCompatActivity {

    private final String USER_AGENT = "Mozilla/5.0";
    String url = "<some URL here>";
    String currentWinnerName = "";

    TextView currentWinnerLabel;

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

        currentWinnerLabel = (TextView)findViewById(R.id.currentWinnerLabel);
        currentWinnerLabel.setText("Finding...");
        try
        {
            checkCurrentWinner();
        }
        catch (Exception e)
        {
            //print e.getMessage() to log
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    //HTTP GET Request to Swagbucks HRW iframe page
    public void checkCurrentWinner() throws Exception
    {
        URL obj = new URL(url);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();

        // optional default is GET
        con.setRequestMethod("GET");

        //add request header
        con.setRequestProperty("User-Agent", USER_AGENT);

        int responseCode = con.getResponseCode();

        if(responseCode == 200)
        {
            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
            String inputLine;
            StringBuffer response = new StringBuffer();

            while ((inputLine = in.readLine()) != null)
            {
                response.append(inputLine);
            }
            in.close();

            // strip out your required data with a regex
            Pattern pattern = Pattern.compile(".*<div id=\"randomWinnerName\">([a-z0-9]*)</div>.*");
            Matcher matcher = pattern.matcher(response.toString());

            if (matcher.find())
            {
                currentWinnerName = matcher.group(1);
                currentWinnerLabel.setText(currentWinnerName);
            }
            else
                currentWinnerLabel.setText("Not Found!");
        }
        else
            currentWinnerLabel.setText("ERROR!");
    }
}
package com.projects.appbrewers.swaghrwtracker;
包com.example.myprojects.myapp;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.view.Menu;
导入android.view.MenuItem;
导入android.widget.TextView;
导入java.io.BufferedReader;
导入java.io.InputStreamReader;
导入java.net.HttpURLConnection;
导入java.net.URL;
导入java.util.regex.Matcher;
导入java.util.regex.Pattern;
公共类MainActivity扩展了AppCompatActivity{
私有最终字符串用户_AGENT=“Mozilla/5.0”;
字符串url=“”;
字符串currentWinnerName=“”;
文本视图当前WinnerLabel;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
currentWinnerLabel=(TextView)findViewById(R.id.currentWinnerLabel);
currentWinnerLabel.setText(“查找…”);
尝试
{
checkCurrentWinner();
}
捕获(例外e)
{
//将e.getMessage()打印到日志
}
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(右菜单菜单菜单主菜单);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
//处理操作栏项目单击此处。操作栏将
//自动处理Home/Up按钮上的点击,只要
//在AndroidManifest.xml中指定父活动时。
int id=item.getItemId();
//noinspection SimplifiableIf语句
if(id==R.id.action\u设置){
返回true;
}
返回super.onOptionsItemSelected(项目);
}
//Swagbucks HRW iframe页面的HTTP GET请求
public void checkCurrentWinner()引发异常
{
URL obj=新URL(URL);
HttpURLConnection con=(HttpURLConnection)obj.openConnection();
//可选默认值是GET
con.setRequestMethod(“GET”);
//添加请求头
con.setRequestProperty(“用户代理”,用户代理);
int responseCode=con.getResponseCode();
如果(响应代码==200)
{
BufferedReader in=新的BufferedReader(新的InputStreamReader(con.getInputStream());
字符串输入线;
StringBuffer响应=新的StringBuffer();
而((inputLine=in.readLine())!=null)
{
追加(inputLine);
}
in.close();
//用正则表达式去掉所需的数据
Pattern=Pattern.compile(“%a-z0-9]*)”;
Matcher Matcher=pattern.Matcher(response.toString());
if(matcher.find())
{
currentWinnerName=matcher.group(1);
currentWinnerLabel.setText(currentWinnerName);
}
其他的
currentWinnerLabel.setText(“未找到!”);
}
其他的
currentWinnerLabel.setText(“错误!”);
}
}

您需要在单独的线程中运行此命令,而不是在UI线程中。使用AsyncTask执行checkCurrentWinner()

私有类CheckCurrentWinner扩展异步任务{
公共CheckCurrentWinner(字符串url){
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护字符串doInBackground(整数…参数){
试一试{
checkCurrentWinner();
}捕获(例外e){
}
返回null;
}
@凌驾
受保护的void onPostExecute(字符串结果){
}

在“onPostExecute()”中,可以更改currentWinnerLabel


您可以使用new CheckCurrentWinner()调用这个类。execute()

我确信这里会抛出一个NetworkMainThread异常,而不是像您所说的那样没有发生错误。因此,您只需将它放在一个单独的线程中,如下所示:

new Thread(new Runnable()
{
    @Override
    public void run()
    {
         try
        {
            checkCurrentWinner();
        }
        catch (Exception e)
        {
            //print e.getMessage() to log
        }
    }
}).start();

这里有两种选择: 1.使用
AsyncTask
执行HTTP GET操作

private class CheckUsernameFromUrlTask extends AsyncTask<URL, Integer, String> {
     protected String doInBackground(URL... urlToGetTheUsername) {
         String usernameFromHttpGetMethod = null;
         // code to make (similar to your checkCurrentWinner method)
         //   1. HTTP GET request
         //   2. Extract username (incl. error handling)
         return usernameFromHttpGetMethod;
     }

     protected void onProgressUpdate(Integer... progress) {
         // ignore for now, unless you want to show the progress blocking UI
     }

     protected void onPostExecute(String result) {
         // back in the UI thread. Perform all view operations
         // Handle exceptions by saving the exception thrown in 
         // doInBackground method as an instance variable of this class or
         // changing the return object to be a custom object containing
         // username and exception.
         String labelText = result == null ? "Not Found!" : result;
         currentWinnerLabel.setText(labelText );
     }
 }
  • 使用库。库使用回调对象通过后台线程异步获取请求,因此您不必为异步任务编写代码。有关示例,请参阅改装文档

  • 您正在UI线程上执行网络操作。请使用
    AsyncTask
    在这种情况下,您能告诉我如何使用AsyncTask吗?请使用文档Ohk我不知道如何使用此线程。您能在回答中提供所需的代码吗?谢谢,我会尝试一下!Integer…“是什么意思?很抱歉,有一些问题另一个答案使用相同的术语。另外,我是否必须从doInBackground将获胜者的名字作为'result'传递给onPostExecute?如果你想传递名字,请将其更改为String。我的意思是我不理解'…'符号?另外,我不理解调用CheckCurrentWinner()时调用的函数。execute().doInBackground是否自动调用?这很有帮助!但是url1、url2和url3的值是什么?另外,我猜我可以使用onPostExecute在TextView中设置播放器的名称,但是我如何在“result”中传递它。我要在doInBackground()中调用onPostExecute吗?url1、url2等是doInBackground方法的输入。如果您总是有一个方法,您可以在CheckUsernameFromUrlTask类中对其进行硬编码,否则可以将其作为输入传入。它是
    private class CheckUsernameFromUrlTask extends AsyncTask<URL, Integer, String> {
         protected String doInBackground(URL... urlToGetTheUsername) {
             String usernameFromHttpGetMethod = null;
             // code to make (similar to your checkCurrentWinner method)
             //   1. HTTP GET request
             //   2. Extract username (incl. error handling)
             return usernameFromHttpGetMethod;
         }
    
         protected void onProgressUpdate(Integer... progress) {
             // ignore for now, unless you want to show the progress blocking UI
         }
    
         protected void onPostExecute(String result) {
             // back in the UI thread. Perform all view operations
             // Handle exceptions by saving the exception thrown in 
             // doInBackground method as an instance variable of this class or
             // changing the return object to be a custom object containing
             // username and exception.
             String labelText = result == null ? "Not Found!" : result;
             currentWinnerLabel.setText(labelText );
         }
     }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       // ...
       new CheckUsernameFromUrlTask ().execute(url1, url2, url3);
    }