Halabella
Halabella

Reputation: 59

How to update TextView from AsynkTask?

This is my code: (Some random text to complete question osdifhgsoid hgodfhgo hsdhoigifdshgnvfa oidvojd nobndisfn vbjobsf).

private class DownloadFilesTask extends AsyncTask<String, Integer, Long> {
    protected Long doInBackground(String... urls) {
        try{
            Listen();
        }
        catch (Exception x)
        {
            textIn.setText("shit! " + x.toString());
        }
        long i = 10;
        return i;
    }
}

(Some random text again to complete question(stupid system) dpfgojd ipgsdigjsidoignsdog

public void Listen(){
    int count = 0;
    TextView msg = MyActivity.msg;
    ServerSocket server;
    Socket client;
    try {
        server = new ServerSocket(9797);
        Log.d("My log", "server started");
        Log.d("My log", "waiting for connnections");
        while (started) {
            try{
                msg.setText("waiting for connection"); <=== here crashing
                client = server.accept();
                count++;
                Log.d("My Log", "Connected");
                Log.d("My Log", "aha" + count);
                int i = 0;
                String data = null;
                byte[] bytes = new byte[1024];
                InputStream is = client.getInputStream();
                OutputStream os = client.getOutputStream();
                while (is.available() == 0) {
                    try{
                        Thread.sleep(50);
                    }catch (Exception cc){}
                }
                is.read(bytes, 0, is.available());
                os.write("hala".getBytes());
                client.close();
            }catch (Exception cc)
            {
                cc.toString();
            }
        }

    } catch (Exception el) {
        el.printStackTrace();
    }
}

(Some random text to complete question). Please help

Upvotes: 0

Views: 116

Answers (6)

britzl
britzl

Reputation: 10242

The purpose of an AsyncTask is to do a long running task in a separate thread and then communicate the result back to the UI thread via onPostExecute().

Also, I'm not sure why you use Long as your return value since you do not seem to be using it. A much better solution would be to have Void as return value and save the exception and use that as an indicator if anything went wrong:

private class DownloadFilesTask extends AsyncTask<String, Integer, Void> {

    private Exception exception = null;

    @Override
    protected Void doInBackground(String... urls) {
        try{
            Listen();
        }
        catch (Exception x) {
            exception = x;
        }
    }

    @Override
    public void onPostExecute(Void result) {
        if(exception != null) {
            textIn.setText("shit! " + exception.toString());
        }
        else {
            // long running task was completed successfully
        }
    }
}

Upvotes: 1

Vipin Sahu
Vipin Sahu

Reputation: 1451

private class DownloadFilesTask  extends AsyncTask<Void,    Void,Long>{

    @Override
    protected Long doInBackground(Void... params) {
        publishProgress(progress);
        //calculate progress and value from your  downloading logic 
    try {

        } catch (Exception e) {
            return (long) 0;
        }
        return null;
    }
    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
        //dis method run deafult on UI thread , so every time u publish ur onProgressUpdate will be called and update ur text here 
    }


     @Override
    protected void onPostExecute(Long result) {
        super.onPostExecute(result);
        if(result==0){
            //error occured
        }
    }

// in case of exception return the result as long value to promt to onPostExceute()

Upvotes: 0

lomza
lomza

Reputation: 9706

Good idea would be to return a String in doInBackground(), say exceptionCatched. You can set it to Exception title in catch() block and then in onPostExecuted() just check if(!TextUtils.isEmpty(exceptionCatched)) textIn.setText(exceptionCatched); That's it!

Upvotes: 0

Nirav Ranpara
Nirav Ranpara

Reputation: 13785

Yes, because you are trying to set the TextView inside the doInBackground() method, and this is not allowed.

So there is a solution if you want to set the TextView inside the doInBackground() method, do the UI updating operations inside the runOnUiThread method.

Otherwise, suggestion is to do all the UI display/update related operations inside the onPostExecute() method instead of doInBackground() method of your AsyncTask class.

Upvotes: 0

F.X.
F.X.

Reputation: 7317

I'm guessing runOnUiThread. You can't update the UI from any other thread than the UI thread.

Upvotes: -1

Niraj Adhikari
Niraj Adhikari

Reputation: 1728

change it via the onPostExecute method!

Upvotes: 3

Related Questions