1

我有这个代码来接收聊天消息。但是当我试图把它放进去时我很困惑AsyncTask。当我把它放进去时,read cannot be resolved我有警告。 我想让这段代码在后台工作,以检查是否有任何消息。我想问一下,让代码始终在后台运行是使用它还是有其他方法可以做到这一点? 任何人都请帮助我,我很困惑如何制作它。谢谢你read.readline()postexecute
AsyncTask

接收消息部分

HttpURLConnection connection;
        URL url = null;
        try{
            linkurl = new Koneksi(this);
            SERVER_URL = linkurl.getUrl();
            SERVER_URL += "/mobile/ChatRoom.php?idu="+param2+"&idch="+param3+"&idcm="+param4;
            url = new URL(SERVER_URL);
            connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setRequestMethod("POST");    

            HttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(SERVER_URL);
            //ArrayList<NameValuePair> param = new ArrayList<NameValuePair>();
            //add parameter
                //httpPost.setEntity(new UrlEncodedFormEntity(param));

                HttpResponse httpRespose = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpRespose.getEntity();

                //read content
                InputStream in = httpEntity.getContent();
                BufferedReader read = new BufferedReader(new InputStreamReader(in));
                String msg = "tes";
                while(true)
                {

                    try {
                        msg = read.readLine();
                        Log.d("","MSGGG:  "+ msg);

                        //msgList.add(msg);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.getMessage();
                    }
                    if(msg == null)
                    {
                        break;
                    }
                    else
                    {
                        showMessage(msg, false);
                    }
                }}
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

            }

我尝试过的 AsyncTask 部分 - 更新但getintent()在我必须放置这些代码的位置收到警告?

public class ReceivedTask extends AsyncTask<String, String, String> {

    Bundle bundle = this.getIntent().getExtras();
    final String param2 = bundle.getString("keyUserId");
    final String param3 = bundle.getString("keyChatsId");
     String param4 = bundle.getString("keyMessagesId");

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... arg0) {
        // TODO Auto-generated method stub

        HttpURLConnection connection;
        URL url = null;
        try{
            linkurl = new Koneksi(ChatRoom.this);
            SERVER_URL = linkurl.getUrl();
            SERVER_URL += "/mobile/ChatRoom.php?idu="+param2+"&idch="+param3+"&idcm="+param4;
            url = new URL(SERVER_URL);
            connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setRequestMethod("POST");    

            HttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(SERVER_URL);
            //ArrayList<NameValuePair> param = new ArrayList<NameValuePair>();
            //add parameter
                //httpPost.setEntity(new UrlEncodedFormEntity(param));

                HttpResponse httpRespose = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpRespose.getEntity();

                //read content
                InputStream in = httpEntity.getContent();
                BufferedReader read = new BufferedReader(new InputStreamReader(in));
                String msg = "tes";
                while(true)
                {

                    try {
                        msg = read.readLine();
                        Log.d("","MSGGG:  "+ msg);

                        //msgList.add(msg);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.getMessage();
                    }
                    if(msg == null)
                    {
                        break;
                    }
                    else
                    {
                        showMessage(msg, false);
                    }
                }}
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

            }
    }

ChatRoom.java - 我的完整代码

public class ChatRoom extends Activity {
    public Koneksi linkurl;
    String SERVER_URL;
    private EditText messageText;
    private TextView meLabel;
    private TextView friendLabel;
    private ViewGroup messagesContainer;
    private ScrollView scrollContainer;
/*    private Handler handler = new Handler();*/

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.chatpage);

        messagesContainer = (ViewGroup) findViewById(R.id.messagesContainer);
        scrollContainer = (ScrollView) findViewById(R.id.scrollContainer);

        Button sendMessageButton = (Button) findViewById(R.id.sendButton);

        Bundle bundle = this.getIntent().getExtras();
        /*final String paramnama = bundle.getString("nama");*/
        messageText = (EditText) findViewById(R.id.messageEdit);
        meLabel = (TextView) findViewById(R.id.meLabel);
        friendLabel = (TextView) findViewById(R.id.friendLabel);
        meLabel.setText("me");


        final String param1 = bundle.getString("keyCourseId");
        final String param2 = bundle.getString("keyUserId");
        final String param3 = bundle.getString("keyChatsId");
         String param4 = bundle.getString("keyMessagesId");


        sendMessageButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
                postParameters.add(new BasicNameValuePair("messages", messageText.getText().toString()));

                String response = null;

                try {
                    linkurl = new Koneksi(ChatRoom.this);
                    SERVER_URL = linkurl.getUrl();
                    SERVER_URL += "/mobile/ChatKirimTeks.php?idu="+param2+"&idch="+param3;
                   response = CourseHttpClient.executeHttpPost(SERVER_URL, postParameters);

                   String res = response.toString();

                   res = res.trim();

                   res = res.replaceAll("\\s+","");
                   if(res.equals("1")){
                       String messageString = messageText.getText().toString();
                       showMessage(messageString, true);
                       messageText.getText().clear();
                   }else
                   {
                       createDialog("Maaf", "Messages Anda Gagal Terkirim");
                   }
                }

                catch (Exception e) {

                    messageText.setText(e.toString());  

                }

             }

        });


        HttpURLConnection connection;
        URL url = null;
        try{
            linkurl = new Koneksi(this);
            SERVER_URL = linkurl.getUrl();
            SERVER_URL += "/mobile/ChatRoom.php?idu="+param2+"&idch="+param3+"&idcm="+param4;
            url = new URL(SERVER_URL);
            connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setRequestMethod("POST");    

            HttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(SERVER_URL);
            //ArrayList<NameValuePair> param = new ArrayList<NameValuePair>();
            //add parameter
                //httpPost.setEntity(new UrlEncodedFormEntity(param));

                HttpResponse httpRespose = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpRespose.getEntity();

                //read content
                InputStream in = httpEntity.getContent();
                BufferedReader read = new BufferedReader(new InputStreamReader(in));
                String msg = "tes";
                while(true)
                {

                    try {
                        msg = read.readLine();
                        Log.d("","MSGGG:  "+ msg);

                        //msgList.add(msg);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.getMessage();
                    }
                    if(msg == null)
                    {
                        break;
                    }
                    else
                    {
                        showMessage(msg, false);
                    }
                }}
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

            }


    public class ReceivedTask extends AsyncTask<String, String, String> {

        @Override
        protected void onPreExecute() {

        }

        @Override
        protected String doInBackground(String... arg0) {
            // TODO Auto-generated method stub
            HttpURLConnection connection;
            URL url = null;
            try{
                linkurl = new Koneksi(ChatRoom.this);
                SERVER_URL = linkurl.getUrl();
                SERVER_URL += "/mobile/ChatRoom.php?idu="+param2+"&idch="+param3+"&idcm="+param4;
                url = new URL(SERVER_URL);
                connection = (HttpURLConnection) url.openConnection();
                connection.setDoOutput(true);
                connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                connection.setRequestMethod("POST");    

                HttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(SERVER_URL);
                //ArrayList<NameValuePair> param = new ArrayList<NameValuePair>();
                //add parameter
                    //httpPost.setEntity(new UrlEncodedFormEntity(param));

                    HttpResponse httpRespose = httpClient.execute(httpPost);
                    HttpEntity httpEntity = httpRespose.getEntity();

                    //read content
                    InputStream in = httpEntity.getContent();
                    BufferedReader read = new BufferedReader(new InputStreamReader(in));
            }
            catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return null;
            }

        }
        @Override
        protected void onPostExecute(String result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            String msg = "tes";
            while(true)
            {

                try {
                    msg = read.readLine();
                    Log.d("","MSGGG:  "+ msg);

                    //msgList.add(msg);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.getMessage();
                }
                if(msg == null)
                {
                    break;
                }
                else
                {
                    showMessage(msg, false);
                }
            }
        }
    }

    public void showMessage(String message, boolean leftSide) {
        final TextView textView = new TextView(ChatRoom.this);
        textView.setTextColor(Color.BLACK);
        textView.setText(message);

        int bgRes = R.drawable.left_message_bg;

        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);

        if (!leftSide) {
            bgRes = R.drawable.right_message_bg;
            params.gravity = Gravity.RIGHT;
        }

        textView.setLayoutParams(params);

        textView.setBackgroundResource(bgRes);

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                messagesContainer.addView(textView);

                // Scroll to bottom
                if (scrollContainer.getChildAt(0) != null) {
                    scrollContainer.scrollTo(scrollContainer.getScrollX(), scrollContainer.getChildAt(0).getHeight());
                }
                scrollContainer.fullScroll(View.FOCUS_DOWN);
            }
        });
    }

    private void createDialog(String title, String text) {
        AlertDialog ad = new AlertDialog.Builder(this)
        .setPositiveButton("Ok", null)
        .setTitle(title)
        .setMessage(text)
        .create();
        ad.show();
    }
}
4

2 回答 2

1

您收到错误消息read cannot be resolved是因为 Android 禁止您从用户界面线程访问互联网。您必须在后台线程中执行此操作。事实上,使用AsyncTask的目的是让用户界面线程尽可能自由。

每当我使用AsyncTask时,我通常会创建一个类来保存任务的所有参数,并创建另一个类来保存结果。此外,我确保结果类可以表示可能发生的任何错误情况,例如抛出的异常。所以我使用的通用模板看起来像这样(注意:这是在不需要进度报告时使用的)。

public class MyActivity extends Activity {

    static class MyAsyncTaskParameters {
        // put all the parameters that the task will need here
    }

    void KickOffAsynctask(...) {  // various arguments as required by the task in hand
        MyAsyncTaskParameters params = new MyAsyncTaskParameters(...);  // package up all the parameters
        MyAsyncTask newtask = new MyAsyncTask();
        newtask.execute(params);
    }

    static class MyAsyncTaskResults {
        // put all the results that the task can generate here
        // NOTE: errors can occur in tasks, also exceptions
        //       can be thrown in tasks, so make it possible
        //       for this class to describe all error conditions that can occur
    }

    static class MyAsyncTask extends AsyncTask<MyAsyncTaskParameters, Void, MyAsyncTaskResults> {

        @Override
        protected MyAsyncTaskResults doInBackground(MyAsyncTaskParameters... params) {
            MyAsyncTaskResults results = new MyAsyncTaskResults();
            try {
                MyAsyncTaskParameters taskParameters = params[0];
                // This method will run in a background thread, so
                // do as much as possible of the AsyncTask here.
            } catch (Throwable e) {
                // Set results object to indicate that an exception occurred.
            }
            return results;
        }

        @Override
        protected void onPostExecute(MyAsyncTaskResults res) {
            // This method will run in the User Interface thread.
            // Use it to deal with the results stored in res.
            // If an error has occurred, the res object will have it stored
            // so take appropriate action, e.g. report to user.
        }

    }

}
于 2013-06-18T13:57:31.960 回答
0

使用AsyncTask,做你的工作doInBackground(...)。从那里返回您的消息,并在onPostExecute(...).

@Override
protected void onPostExecute(String result) {
    String msg = "tes";  // Why? You have 'result' String reference one line above.

不要在 中读取流onPostExecute,将其作为后台任务的一部分进行。否则,您将阻塞 UI 线程。

请参阅onPostExecute

于 2013-06-18T05:33:32.757 回答