Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将值从onPostExecute()发送到活动_Java_Android_Android Asynctask_Textview_Httprequest - Fatal编程技术网

Java 如何将值从onPostExecute()发送到活动

Java 如何将值从onPostExecute()发送到活动,java,android,android-asynctask,textview,httprequest,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() {

首先,我必须说我是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扩展了AsyncTask{
私有void请求任务(字符串URL){
HttpClient HttpClient=新的DefaultHttpClient();
HttpResponse响应;
//这里有一些代码。。。
回报率;
}
@凌驾
受保护的字符串doInBackground(字符串…uri){
HttpClient HttpClient=新的DefaultHttpClient();
HttpResponse响应;
字符串responseString=null;
//这里有一些代码。。。
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
//我的结果是“结果”
}
我想将此字符串值发送并写入MainActivty中的TextView。如何发送“结果”?

提前感谢。

您可以将TextView传递给RequestTask的构造函数,也可以将其设置为全局成员。在onPostExecute方法中:

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);

    yourTextView.setText(result);

}
就这样:)


Edit:Whoops。正如sromku正确指出的那样,AsyncTask已经在一个单独的线程(后台)中执行
doInBackground()
方法因此,您不应该将其包装在另一个线程中。因此,请删除该线程异常。

您可以将TextView传递给RequestTask的构造函数或使其成为全局成员。在onPostExecute方法中:

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);

    yourTextView.setText(result);

}
就这样:)


Edit:Whoops。正如sromku正确指出的,AsyncTask已经在一个单独的线程(在后台)中执行了
doInBackground()
方法,因此您不应该将其包装到另一个线程中。因此,请删除该线程异常。

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

这是正确的代码:

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

您可以通过多种方式完成此任务。以下是其中的一部分:

  • AyncTask
    定义为
    Activity
    中的内部类。您可以访问
    AsyncTask
    Activity
    的成员。此选项非常耦合,意味着异步任务,显然应用程序的逻辑是ui的一部分。如下所示:

    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);
            }
        } 
    
    }
    
    以及您的活动:

    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"); 
        } 
    
    }
    
    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"); 
        } 
    
    }
    
  • 要使程序更松散地耦合,并更好地将控制器与视图分离,请使用
    Handler
    s:

    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);
            }
        }
    }
    
    你可以从任何线程“发送消息”,你可以用这个工具很好地解耦你的应用程序


  • 不要打开新线程以从此线程运行异步任务。它将不起作用(将在内部处理程序上失败)。异步任务本身将为您打开一个新线程

    这是正确的代码:

    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

    您可以通过多种方式完成此任务。以下是其中的一部分:

  • AyncTask
    定义为
    Activity
    中的内部类。您可以访问
    AsyncTask
    Activity
    的成员。此选项非常耦合,意味着异步任务,显然应用程序的逻辑是ui的一部分。如下所示:

    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);
            }
        } 
    
    }
    
    以及您的活动:

    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"); 
        } 
    
    }
    
    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"); 
        } 
    
    }
    
  • 要使程序更松散地耦合,并更好地将控制器与视图分离,请使用
    Handler
    s:

    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);
            }
        }
    }
    
    你可以从任何线程“发送消息”,你可以用这个工具很好地解耦你的应用程序

  • 最佳解决方案

    我建议您使用这个库,而不是为不同类型的异步任务使用这么多的类

    你可以看看这里

    您的代码将变得非常非常少,您可以只使用4行代码,而不是声明可以分别编写大量代码

    AsyncHttpClient client = new AsyncHttpClient();
    client.get("http://www.google.com", new AsyncHttpResponseHandler() {
    @Override
    public void onSuccess(String response) {
        System.out.println(response);
       }
    });
    
    我能很快得到回复

    我希望这能帮到你。:)

    最佳解决方案

    我建议您使用这个库,而不是为不同类型的异步任务使用这么多的类

    你可以看看这里

    您的代码将变得非常非常少,您可以只使用4行代码,而不是声明可以分别编写大量代码

    AsyncHttpClient client = new AsyncHttpClient();
    client.get("http://www.google.com", new AsyncHttpResponseHandler() {
    @Override
    public void onSuccess(String response) {
        System.out.println(response);
       }
    });
    
    我能很快得到回复


    我希望这能帮助您。:)

    将其移动到完成答案。但是我的+1:)将其移动到完成答案。但是我的+1:)我将TextView变量作为全局成员创建,但如果我在RequestTask类中定义MainActivity并使用somevalue.TextView.setText(结果)调用,它不会出现在RequestTask中;程序失败。由于存在RequestTask()方法,因此没有意义如何将TextView变量发送到RequestTask的构造函数。@user3077045查看我的应答我将TextView变量作为全局成员,但如果我在RequestTask类中定义MainActivity并使用somevalue.TextView.setText(结果)调用,则该变量不会出现在RequestTask中;程序失败。这没有意义,因为有一个方法是RequestTask()。如何将TextView的变量发送到RequestTask的构造函数中。@user3077045查看我的答案