user3077045
user3077045

Reputation: 25

How Can I Send Value From onPostExecute() to Activity

First of all I must say I'am new at Android but not at Java. I did HttpRequest With AsyncTask.

    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(); 
}

Created Another Class ( Name : 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'
  }

I want to send and write this string value to TextView In MainActivty. How can i send 'result' ?
Thanks in advance..

Upvotes: 1

Views: 2275

Answers (3)

sromku
sromku

Reputation: 4683

Don't open a new thread to run the async task from this thread. It won't work (will fail on internal handler). The async task by himself open for you a new thread.

This is the right code:

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"); 
}

And in your RequestTask

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

Edit: To your question, how to access TextView from AsyncTask
You can do it in many ways. These are part of them:

  1. Define AyncTask as an inner class inside your Activity. You can access members of Activity within AsyncTask. This option is very coupled, means async task which apparently the logic of your app is part of your ui. Like this:

    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. Deliver the TextView to AsyncTask by constructor or setter method. This option is less coupled, since this AsyncTask can be used by many consumers who want to update their TextView, but the is still coupling by holding reference from AsyncTask to your views.
    Your 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);
            }
        }
    }
    

    And your 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. To make your program more loosely coupled and to make better separation of controller from your views, use Handlers:

    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);
            }
        }
    }
    

    And your 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"); 
        } 
    
    }
    

    Handlers cave tons of options. You can 'send message' from any thread and you can decouple your app very good with this tool.

Upvotes: 4

Udit Kapahi
Udit Kapahi

Reputation: 2337

best solution

Instead of using so many classes for different types of asynctask , I suggest you use this library

you can have a look at here

http://loopj.com/android-async-http/

your code will become very very less , instead of declaring so may asynctask seperately writing bulk of code , you can just use 4 lines of code

AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {
@Override
public void onSuccess(String response) {
    System.out.println(response);
   }
});

I is very efficient in geting the response very quickly.

I hope this will help you out. :)

Upvotes: 0

Saket
Saket

Reputation: 3076

You can either pass the TextView to RequestTask's constructor or make it a global member. And in your onPostExecute method:

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

    yourTextView.setText(result);

}

That's it :)

Edit: Whoops. As sromku correctly pointed out, AsyncTask already performs the doInBackground() method in a separate thread (in background) so you should not be wrapping it in another thread. So, remove that Thread-ception.

Upvotes: 1

Related Questions