java - 如何将值从 onPostExecute() 发送到 Activity

标签 java android android-asynctask textview httprequest

首先,我必须说我是 Android 新手,但不是 Java 新手。 我用 AsyncTask 做了 HttpRequest。

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

    Thread th = new Thread(new Runnable() {     
        @Override
        public void run() {             
            new RequestTask().execute("http://www.url.com/ajaxrequest/?kategori=27");
        }
    });             
        th.start(); 
}

创建了另一个类(名称:RequesTask)

class RequestTask extends AsyncTask<String, String, String>{

private void RequestTask(String URL){

    HttpClient httpclient = new DefaultHttpClient();
    HttpResponse response;
    // Some Codes Here...

    return responseString;
}

@Override
protected String doInBackground(String... uri) {
    HttpClient httpclient = new DefaultHttpClient();
    HttpResponse response;
    String responseString = null;
    // Some Codes Here...

}

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
    // My Result is 'result'
  }

我想将此字符串值发送并写入 MainActivty 中的 TextView。我如何发送“结果”?
提前致谢..

最佳答案

不要打开一个新线程从这个线程运行异步任务。它不会工作(将在内部处理程序上失败)。异步任务自己为您打开一个新线程。

这是正确的代码:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    textView = (TextView) findViewById(R.id.your_text_view);

    new RequestTask().execute("http://www.url.com/ajaxrequest/?kategori=27"); 
}

在你的RequestTask

@Override
protected void onPostExecute(String result) {
    textView.setText(result);
}

编辑:对于您的问题,如何从AsyncTask
访问TextView 您可以通过多种方式做到这一点。这些是其中的一部分:

  1. AyncTask 定义为 Activity 中的内部类。您可以在 AsyncTask 中访问 Activity 的成员。这个选项是非常耦合的,意味着异步任务显然你的应用程序的逻辑是你的用户界面的一部分。像这样:

    class YouActivity extends Activity { 
    
        TextView textView;
    
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            textView = (TextView) findViewById(R.id.your_text_view);
    
            new RequestTask().execute("http://www.url.com/ajaxrequest/?kategori=27"); 
        }
    
        class RequestTask extends AsyncTask<String, String, String> {
            ...
            @Override
            protected void onPostExecute(String result) {
                textView.setText(result);
            }
        } 
    
    }
    
  2. 通过构造函数或setter 方法将TextView 传递给AsyncTask。这个选项的耦合度较低,因为这个 AsyncTask 可以被许多想要更新他们的 TextView 的消费者使用,但是它仍然通过持有 AsyncTask< 的引用来耦合 加入你的观点。
    您的 AsyncTask:

    class RequestTask extends AsyncTask<String, String, String> {
    
        TextView textView = null;
    
        public void setTextView(TextView textView) {
            this.textView = textView;
        }
    
        ...
    
        @Override
        protected void onPostExecute(String result) {
            if (textView != null) {
                textView.setText(result);
            }
        }
    }
    

    以及您的 Activity :

    class YouActivity extends Activity { 
    
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            TextView textView = (TextView) findViewById(R.id.your_text_view);
    
            RequestTask requestTask = new RequestTask();
            requestTask.setTextView(textView);
            requestTask.execute("http://www.url.com/ajaxrequest/?kategori=27"); 
        } 
    
    }
    
  3. 为了使您的程序更加松散耦合并更好地将 Controller 与您的 View 分离,请使用 Handler:

    class RequestTask extends AsyncTask<String, String, String> {
    
        Handler handler = null;
    
        public void setHandler(Handler handler) {
            this.handler = handler;
        }
    
        ...
    
        @Override
        protected void onPostExecute(String result) {
            if (handler != null) {
                Message message = new Message();
        message.obj = result;
                handler.sendMessage(message);
            }
        }
    }
    

    以及您的 Activity :

    class YouActivity extends Activity { 
    
        TextView textView;
    
        Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                 String value = (String) msg.obj;
                 textView.setText(value);
            }
        };
    
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            textView = (TextView) findViewById(R.id.your_text_view);
    
            RequestTask requestTask = new RequestTask();
            requestTask.setHandler(handler);
            requestTask.execute("http://www.url.com/ajaxrequest/?kategori=27"); 
        } 
    
    }
    

    处理程序提供大量选项。您可以从任何线程“发送消息”,并且可以使用此工具很好地解耦您的应用程序。

关于java - 如何将值从 onPostExecute() 发送到 Activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22519541/

相关文章:

java - GridLayout 中的 JLabel 并不总是被绘制

java - 将 facebook 连接个人资料图片保存到自己的服务器

java - JAVA 中的 toStrings 单元测试

java - 如何使用数据压缩将数据从服务器传输到 Android 设备?

android - onPostExecute 取消 AsyncTask

java - 如何通过选择微调项目来更改应用程序语言?

java - android eclipse错误:Error: no resource found that matches the given name (at 'text' with value '@string/red' )

android - 有什么方法可以计算滚动结束位置

android - 如何在 Android 中从 PostExecute 正确启动 Activity ?

Android:在单独的线程中异步运行一个方法