0

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

}

0

3 Answers 3

3

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);
Sign up to request clarification or add additional context in comments.

4 Comments

cannot apply setWebService method because I get "cannot resolve symbol" error for "this.listener"
change it to this.webServiceInterface then try
I still get error, where to put service.setWebServiceInterface(this)?
you can put it after service = new WebService(); this line
2

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

5 Comments

yap. wherever you want your AsyncTask to be called
i get syntax error, it says these onSuccess and onFail methods clash with webServiceInterface methods
those methods are overriden methods let me remind you
you have override that method from interface you dnt have to again create it.
and remove implements WebServiceInterface from MainActivity
0

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.