【问题标题】:AsynTask + Http PostAsyncTask + Http Post
【发布时间】:2014-08-04 13:33:06
【问题描述】:

我已经实现了 AsyncTask 来向 webService 发出 http 请求,但是当我尝试获取服务器返回的编译器字符串时它给了我一个错误。

这是我认为 AsyncTask 的活动代码:

public String consultaPreguntaBBDD(int num, String tab)
{
    HttpAsyncTask httpAsyncTask = new HttpAsyncTask(String.valueOf(num),tab);
    /*(!)*/String resul = httpAsyncTask.execute("http://appdomain.hol.es/webService.php");
    return resul;
}   

我写这个(!)的地方编译器说:类型不匹配:无法从 AsyncTask 转换为字符串 这是 AsyncTask 类:

class HttpAsyncTask extends AsyncTask<String, Void, String> 
{
    private static String id;
    private static String te;
    public  HttpAsyncTask(String id,String te)
    {
            this.id = id;
            this.te = te;
     }
    @Override
    protected String doInBackground(String... urls) 
    {
        return POST(urls[0]);
    }
    // onPostExecute displays the results of the AsyncTask.
    @Override
    protected void onPostExecute(String result) 
    {

    }

    public static String POST(String url)
    {
        InputStream inputStream = null;
        String result = "";
        try 
        {

            HttpClient httpclient = new DefaultHttpClient();

            // 2. make POST request to the given URL
            HttpPost httpPost = new HttpPost(url);
           // pass parameters in this way

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("id", id));
            nameValuePairs.add(new BasicNameValuePair("te", te));

            //add data
            httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            // 8. Execute POST request to the given URL
            HttpResponse httpResponse = httpclient.execute(httpPost);

            // 9. receive response as inputStream
            inputStream = httpResponse.getEntity().getContent();

            // 10. convert inputstream to string
            if(inputStream != null)
                result = convertInputStreamToString(inputStream);
            else
                result = "Did not work!";

        } catch (Exception e) 
        {
    Log.d("InputStream", e.getLocalizedMessage());
        }
        // 11. return result
        return result;
    }

    private static String convertInputStreamToString(InputStream inputStream) throws IOException {
        // TODO Auto-generated method stub

        BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
        String line = "";
        String result = "";
        while((line = bufferedReader.readLine()) != null)
            result += line;

        inputStream.close();
Log.i("http","result: "+result+"\n");
    return result;
    }
}

我有两个文件,每个班级一个 谁能帮我?谢谢

【问题讨论】:

  • @jaimin 我复制了帖子以便更好地查看问题
  • 在stackoverflow中你不能再次发布同样的问题/怀疑,否则你会被否决
  • @jaimain 对不起,我不知道

标签: android http android-asynctask


【解决方案1】:

问题是:

httpAsyncTask.execute()

返回一个自身的实例,它是一个AsyncTask 类。这无法转换为 String,这就是您收到错误的原因。

.execute 不会返回运行AsyncTask 的结果——它只是启动它。要获得结果,您需要在工作线程完成其任务后在可用的地方访问它。

你应该如何解决它是完全实现:

protected void onPostExecute(String result)

在您的 AsyncTask 班级中。这个函数的参数是你试图从.execute开始得到的结果。当结果准备好时,您可以在此处安全地访问它,并且您可以在此处执行您想要的操作(调用适当的函数来处理结果,更新文本视图等)。这是异步方法调用背后的一般思想。您不会立即获得结果,而是获得结果

【讨论】:

  • 所以最好的解决方案是实现方法 protected void OnPostExecute (String result),但是我可以启动我的 AsyncTask 活动,然后从 AsyncTask 作为另一个类的更改对象(变量 textview)?我必须将 AsyncTask 类放在我的活动类中吗?您可以使用@jaimin 所说的,并使用对象尝试将 AsyncTask 的到达与等待和通知同步?
  • 如果我理解正确,您会问是否可以更改,例如AsyncTask 类中的文本视图对吗?如果这就是你所问的,那么答案是:是的,你可以。 AsyncTask 有许多方法,但它们运行在不同的线程上。 onPostExecute 在 UI 线程上运行,因此可以直接从那里更新 UI 元素。最简单的方法是让您的 AsyncTask 成为 Activity 中的 InnerClass,这样您就可以直接访问元素。如果没有,则在启动时为 AsyncTask 提供一个 Activity 实例,并使用适当的方法从 onPostExecute 更新它。
  • 我在学习 AsyncTask 的时候看过这个视频,所以如果你能抽出 30 分钟的时间,它是值得一看的,因为它很好地解释了 AsyncTask,并有一个很好的简单示例。 youtube.com/watch?v=t988JQHDbX0
【解决方案2】:

像这样编辑一些代码

public String consultaPreguntaBBDD(int num, String tab)
{
HttpAsyncTask httpAsyncTask = new HttpAsyncTask(String.valueOf(num),tab);
Object resul = httpAsyncTask.execute("http://appdomain.hol.es/webService.php");
return resul.toString();

}

httpAsyncTask.execute("http://appdomain.hol.es/webService.php");正在返回一个对象,因此将 resul 更改为 objext 类型,然后将其转换为字符串

【讨论】:

  • 这是一个有问题的解决方案。这不会给他 doInBackground 的结果(这可能是他想要的),而是启动他的工作线程的对象的字符串表示。它会解决他的编译时错误,但不会解决他的问题。
  • 谢谢,但是您可能想使用我转换对象的字符串时,该方法尚未完成异步并且这不为空?所以之前说过最好创建一个函数,调用异步no类?
  • 最好只调用httpAsyncTask.execute(),不要将结果赋给任何变量。然后在 AsyncTask() 中处理 onPostExecute 中的结果。希望这是有道理的。
猜你喜欢
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多