使用 AsyncTask 传递值 [英] Using AsyncTask with passing a value

查看:26
本文介绍了使用 AsyncTask 传递值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在努力解决这个问题,但我已经到了不知道该怎么办的地步.我想要做的是使用一个类来下载一个文件并将其解析为一个字符串,然后将该字符串发送到另一个类以解析出 JSON 内容.所有部件都可以正常工作,我已经单独测试了所有部件.我只是不知道如何将值发送到 Json 解析以开始解析.

I have been working on this and I have hit a point where I dont know what to do. What I am trying to do is use one class to download and parse out a file into a string and then send that string to another class to parse out the JSON stuff. All the parts work fine by themselves and I have tested everything separately. I just dont know how to send the value to the Json parses to start the parsing.

这是我的文件下载器类.

So this is my filedownloader class.

  public class JsonFileDownloader extends AsyncTask<String, Void, String> {
  //used to access the website
  String username = "admin";
  String password = "admin";
  public String ret = "";



  @Override
  protected String doInBackground(String... params) {
      Log.d("Params ", params[0].toString());
      readFromFile(params[0]);
      return ret;
  }

  private String readFromFile(String myWebpage) {

      HttpURLConnection urlConnection = null;

      try {
          //Get the url connection
          URL url = new URL(myWebpage);
          Authenticator.setDefault(new Authenticator() {
              @Override
             protected PasswordAuthentication getPasswordAuthentication()   {
                  return new PasswordAuthentication(username,   password.toCharArray());
            }
          });
          urlConnection = (HttpURLConnection) url.openConnection();

          InputStream inputStream = urlConnection.getInputStream();


          if (inputStream != null) {
              ret = streamToString(inputStream);
              inputStream.close();
              Log.d("Final String", ret);
          }

      } catch (FileNotFoundException e) {
          e.printStackTrace();
      } catch (IOException e) {
          e.printStackTrace();
      } finally {
          if (urlConnection != null) {
              urlConnection.disconnect();
          }
          return ret;

      }
  }
  public static String streamToString(InputStream is) throws IOException   {

      StringBuilder sb = new StringBuilder();
      BufferedReader rd = new BufferedReader(new InputStreamReader(is));
      String line;
        while ((line = rd.readLine()) != null) {
          sb.append(line);
      }
       return sb.toString();
   }

  public String getJsonData()
  {
      return ret;
   }

}

这很好用,我已经一遍又一遍地测试它,没有错误.接下来是Json解析器,就是这个样子.

This works fine I have tested it over and over with no errors. The next is the Json parser which is like this.

public class JSONParser {

JSONObject jsonResponse;
String jsonData;

//Consturctor
public JSONParser()
{
    //this.jsonData = jsonData;
    // this.OutputData = outPutData;
}

public void parsesData(String promo,
                       ArrayList<String> pictureHTTP,
                       ArrayList<String> pathHTTP,
                       ArrayList<String> labelText) throws IOException {

    //Build the Json String
    JsonFileDownloader jfd = new JsonFileDownloader();
   // jsonData = String.valueOf(jfd.execute(promo));
    jfd.execute(promo);
    //jfd.getResuts(jsonData);
    //jsonData = jfd.ret;

    Log.d("JsonData String = " , jsonData);


    //Try to parse the data
    try
    {

        Log.d("Jsondata " , jsonData);
        //Creaate a new JSONObject ith the name/value mapping from the JSON string
        jsonResponse = new JSONObject(jsonData);
        //Returns the value mapped by the name if it exists and is a JSONArry
        JSONArray jsonMainNode = jsonResponse.optJSONArray("");

        //Proccess the JSON node
        int lenghtJsonArrar = jsonMainNode.length();
        for (int i = 0; i<lenghtJsonArrar; i++)
        {
            //Get object for each json node
            JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
            //Get the node values
            //int song_id = Integer.parseInt(jsonChildNode.optString("song_id").toString());
            String picture = jsonChildNode.optString("picture").toString();
            String pathName = jsonChildNode.optString("path").toString();
            String lableName = jsonChildNode.optString("label".toString());
            //Debug Testing code
            pictureHTTP.add(picture);
            pathHTTP.add(pathName);
            labelText.add(lableName);


        }

    } catch (JSONException e) {
        e.printStackTrace();
    }

}

现在我知道问题出在哪里了.当我尝试为 jsonData 分配一个值时,它永远不会被分配,因此它为空并且系统失败.我在 jfd.exicute() 之后尝试了一些东西,但我只是不知道如何将最终字符串输出中的值获取到 jsonData 中.感谢您对此的任何帮助.

Now I know where the problem is occurring. When i try to assign a value to the jsonData it never is assigned so it is null and the system fails. I have tried a few things after the jfd.exicute() but I just dont know how to get the value from the final string output into the jsonData. Thank you for any help with this.

推荐答案

好的,这里有一个非常灵活的模式,用于使用 AsyncTask 下载 Web 内容并将结果返回给 UI 线程.

Alright, here is a pretty flexible pattern for the overall usage of using AsyncTask to download web content and getting the results from it back to the UI thread.

步骤 1 定义一个接口,该接口将充当 AsyncTask 和您想要数据的位置之间的消息总线.

Step 1 Define an interface that will act as a message bus between the AsyncTask and where you want the data.

public interface AsyncResponse<T> {
    void onResponse(T response);
}

第 2 步 创建一个通用的 AsyncTask 扩展,该扩展将采用任何 URL 并从中返回结果.你基本上已经有了这个,但我做了一些调整.最重要的是,允许设置 AsyncResponse 回调接口.

Step 2 Create a generic AsyncTask extension that will take any URL and return the results from it. You basically had this already, but I made some tweaks. Most importantly, allowing the setting of the AsyncResponse callback interface.

public class WebDownloadTask extends AsyncTask<String, Void, String> {

    private AsyncResponse<String> callback;

    // Optional parameters
    private String username;
    private String password;

    // Make a constuctor to store the parameters
    public WebDownloadTask(String username, String password) {
        this.username = username;
        this.password = password;
    }

    // Don't forget to call this
    public void setCallback(AsyncResponse<String> callback) {
        this.callback = callback;
    }

    @Override
    protected String doInBackground(String... params) {
        String url = params[0];
        return readFromFile(url);
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        if (callback != null) {
            callback.onResponse(s);
        } else {
            Log.w(WebDownloadTask.class.getSimpleName(), "The response was ignored");
        }
    }

    /******* private helper methods *******/

    private String streamToString(InputStream is) throws IOException {

        StringBuilder sb = new StringBuilder();
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
        String line;
        while ((line = rd.readLine()) != null) {
            sb.append(line);
        }
        return sb.toString();
    }

    private String readFromFile(String myWebpage) {

        String response = null;
        HttpURLConnection urlConnection = null;

        try {
            //Get the url connection
            URL url = new URL(myWebpage);

            // Unnecessary for general AsyncTask usage
            /* 
            Authenticator.setDefault(new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(username, password.toCharArray());
                }
            });
            */

            urlConnection = (HttpURLConnection) url.openConnection();

            InputStream inputStream = urlConnection.getInputStream();

            if (inputStream != null) {
                response = streamToString(inputStream);
                inputStream.close();
                Log.d("Final String", response);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
        }

        return response;
    }
}

第 3 步 随时随地使用该 AsyncTask.这是一个例子.请注意,如果您不使用 setCallback,您将无法获取来自 AsyncTask 的数据.

Step 3 Go forth and use that AsyncTask wherever you wish. Here is an example. Note that if you do not use setCallback, you will be unable to get the data that came from the AsyncTask.

public class MainActivity extends Activity {

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

        WebDownloadTask task = new WebDownloadTask("username", "password");
        task.setCallback(new AsyncResponse<String>() {
            @Override
            public void onResponse(String response) {
                // Handle response here. E.g. parse into a JSON object
                // Then put objects into some list, then place into an adapter... 
                Toast.makeText(getApplicationContext(), response, Toast.LENGTH_SHORT).show();
            }
        });

        // Use any URL, this one returns a list of 10 users in JSON
        task.execute("http://jsonplaceholder.typicode.com/users");
    }
}

这篇关于使用 AsyncTask 传递值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆