Burak Akyalçın
Burak Akyalçın

Reputation: 337

Java Interface Callback on Android

I am currently trying to make an android app that basically downloads strings from a url. But I want to make it object oriented. My mainActivity gets string from webService which downloads string when button is clicked. But I am not good at interfaces and callbacks. What should I do to make this code run?

public class MainActivity extends Activity implements WebServiceInterface{
private TextView textView;
private Button readWebPage;
private WebService service;
private WebServiceInterface webServiceInterface;
private String response;
/**
 * Called when the activity is first created.
 */
@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    textView = (TextView) findViewById(R.id.TextView01);
    readWebPage = (Button) findViewById(R.id.readWebpage);
    service = new WebService();
    readWebPage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            service.execute(new String[]{"http://google.com/"});
            onSuccess(response);
        }
    });

}

@Override
public void onSuccess(String response) {
    textView.setText(Html.fromHtml(response));
}

@Override
public void onFail(Exception ex) {
    textView.setText(ex.getLocalizedMessage());
}

}

public class WebService extends AsyncTask<String, Void, String> {

private WebServiceInterface webServiceInterface;
@Override
protected String doInBackground(String... urls) {
    String response = "";
    for (String url : urls) {
        DefaultHttpClient client = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(url);
        try {
            HttpResponse execute = client.execute(httpGet);
            InputStream content = execute.getEntity().getContent();

            BufferedReader buffer = new BufferedReader(
                    new InputStreamReader(content));
            String s = "";
            while ((s = buffer.readLine()) != null) {
                response += s;
            }
        webServiceInterface.onSuccess(response);
        } catch (Exception e) {
            e.printStackTrace();
            webServiceInterface.onFail(e);
        }
    }
    return response;
}

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

}

public interface WebServiceInterface {
void onSuccess(String response);
void onFail(Exception ex);

}

Upvotes: 0

Views: 1984

Answers (3)

Burak Akyal&#231;ın
Burak Akyal&#231;ın

Reputation: 337

I have found the problem, it is because of runOnUiThread is missing.

Upvotes: 0

Tanveer Bulsari
Tanveer Bulsari

Reputation: 213

Add WebService (WebServiceInterface webServiceInterface) in your AsyncTask as a constructor.

 service = new WebService(new WebServiceInterface (){
  void onSuccess(String response){
 //do your stuff
  }
 void onFail(Exception ex){
   //do your stuff
   }
   });

and in your asynctask

  public class WebService extends AsyncTask<String, Void, String> {

 public WebService (WebServiceInterface webServiceInterface){
 this.webinterface= webServiceInterface;
 }


 private WebServiceInterface webinterface;
@Override
 protected String doInBackground(String... urls) {
String response = "";
for (String url : urls) {
    DefaultHttpClient client = new DefaultHttpClient();
    HttpGet httpGet = new HttpGet(url);
    try {
        HttpResponse execute = client.execute(httpGet);
        InputStream content = execute.getEntity().getContent();

        BufferedReader buffer = new BufferedReader(
                new InputStreamReader(content));
        String s = "";
        while ((s = buffer.readLine()) != null) {
            response += s;
        }
    webinterface.onSuccess(response);
    } catch (Exception e) {
        e.printStackTrace();
        webinterface.onFail(e);
    }
}
return response;
 }

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

Upvotes: 2

Ashish Pandya
Ashish Pandya

Reputation: 167

you need to create one public method for set webServiceInterface in WebService class like

public setWebServiceInterface (WebServiceInterface listener)
{
    this.webServiceInterface =listener; 
} 

in MainActivity activity call this method and pass argument this

service.setWebServiceInterface (this);

in WebService class in onPostExecute Method call

webServiceInterface.onSuccess(s);

Upvotes: 3

Related Questions