0

这是我的代码:(一些随机文本来完成问题 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;
    }
}

(一些随机文本再次完成问题(愚蠢的系统)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();
    }
}

(一些随机文本来完成问题)。请帮忙

4

6 回答 6

3

通过 onPostExecute 方法更改它!

于 2013-05-08T11:57:34.903 回答
1

AsyncTask 的目的是在单独的线程中执行长时间运行的任务,然后通过 onPostExecute() 将结果传回 UI 线程。

另外,我不确定您为什么使用 Long 作为返回值,因为您似乎没有使用它。一个更好的解决方案是将 Void 作为返回值并保存异常并在出现任何问题时将其用作指示:

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
        }
    }
}
于 2013-05-08T12:04:55.443 回答
0
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
        }
    }

// 如果发生异常,将结果作为 long 值返回到提示 onPostExceute()

于 2013-05-08T12:07:16.857 回答
0

好主意是返回一个字符串doInBackground(),比如说exceptionCatched。您可以将其设置为块中的Exception标题,catch()然后onPostExecuted()检查if(!TextUtils.isEmpty(exceptionCatched)) textIn.setText(exceptionCatched);就是这样!

于 2013-05-08T12:04:42.393 回答
0

是的,因为您试图在doInBackground() 方法中设置 TextView,这是不允许的。

所以有一个解决方案,如果你想在()方法里面设置TextView ,在runOnUiThread方法doInBackground里面做UI更新操作。

否则,建议在 () 方法中执行所有 UI 显示/更新相关操作,onPostExecute而不是 AsyncTask 类的 doInBackground() 方法。

于 2013-05-08T12:01:37.103 回答
-1

我猜是runOnUiThread。您不能从 UI 线程以外的任何其他线程更新 UI。

于 2013-05-08T11:57:37.027 回答