【问题标题】:Handling data passed to a result argument of AsyncTask.onPostExecute()处理传递给 AsyncTask.onPostExecute() 的结果参数的数据
【发布时间】:2015-11-23 00:10:45
【问题描述】:

我的主要活动中有这个私有类,我正在使用它将一个 JSon 对象从我的服务器拉到我的应用程序中。下面的代码可以正常工作,并将 JSON 对象显示为字符串。

   private class HttpAsyncTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... urls) {

            return httpBuild(urls[0]);
        }
        // onPostExecute displays the results of the AsyncTask.
        @Override
        protected void onPostExecute(String result) {
            Toast.makeText(getBaseContext(), "Received!", Toast.LENGTH_LONG).show();
            etResponse.setText(result);
        }
    }

我想要做的是改变onPostExecute() 方法,使它像webResult = result 一样工作,其中webResultmainActivity 类的一个实例变量问题是一旦我这样做,当我尝试放在调用 HTTpAsyncTask 后,将下面的代码放入 onCreate() 方法中,应用程序无法显示对象并崩溃。

    public class MainActivity extends Activity {

    private static final String mainSite = "http://mysitehere";

    private String webResult;
//    private JSONArray floorsInBuilding, roomsInGender;
//    private JSONObject room;
//    private JSONArray arrayOfFloors;
//    private JSONObject room, arrayOfRooms;

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

        // get reference to the views
        etResponse = (EditText) findViewById(R.id.etResponse);
        tvIsConnected = (TextView) findViewById(R.id.tvIsConnected);

        // check if you are connected or not
        if(isConnected()){
            tvIsConnected.setBackgroundColor(0xFF00CC00);
            tvIsConnected.setText("You are conncted");
        }
        else{
            tvIsConnected.setText("You are NOT conncted");
        }

        // call AsynTask to perform network operation on separate thread
        new HttpAsyncTask().execute(this.buildBuildingAddress(8));
        Toast.makeText(getBaseContext(), "Received!", Toast.LENGTH_LONG).show();
        etResponse.setText(WebResult);
    }

我想知道是什么使显示结果的代码部分依赖于 HttpAsyncTask。我还想知道如何获得 HttpAsyncTask 的结果并将其作为字符串存储在主类中。

我的大部分代码都是基于这个例子。 http://hmkcode.com/android-parsing-json-data/

对不起,如果我对 android 的了解不是很好,但我的经验更多地在于 java。

【问题讨论】:

  • 我不知道崩溃本身的细节。但是这种方法不起作用,因为 asynctask 异步执行(主线程),而 onCreate() 在主线程中执行。因此 etResponse.setText(WebResult) 将在您的 asynctask 与网络调用完成之前执行。这意味着它将 textview 文本值设置为 null。
  • 感谢您的回复,我去和一位同学交谈,他也说了同样的话!这正是问题所在。我不明白该程序不会等待异步任务完成。所以它会尝试打印一个空字符串

标签: android json xml http android-asynctask


【解决方案1】:

如果您想等到任务结束,以便您可以使用 webResult 覆盖结果,那么您可以使用在 UI 线程上运行的 asyncTask 方法 onProgressUpdate。您可以参考 android 开发者网站了解如何使用该方法。

【讨论】:

  • 谢谢,这是我最终采用的方法。作为奖励,我现在可以在 gui 中实现进度条。
  • 是的,您可以在此处向用户显示进度条。您也可以使用 onPublishProgress 方法和 onProgressUpdate 方法。
【解决方案2】:

这个问题的答案是异步任务与onCreate() 一起运行。所以你必须创建一些等待任务完成的代码或者你必须在onPostExecute()方法中操作异步任务的result

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 2023-03-17
    相关资源
    最近更新 更多