запутался, чтобы поместить код в AsyncTask

У меня есть этот код для получения сообщений чата. но я запутался, когда попытался поместить его в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 param = new ArrayList();
            //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 {

    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 param = new ArrayList();
            //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 postParameters = new ArrayList();
                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 param = new ArrayList();
            //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 {

        @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 param = new ArrayList();
                //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();
    }
}
 Raghunandan18 июн. 2013 г., 07:33
что делает showMessage? если вы объявите read в doInbackGround () локальным. объявите ее как переменную класса asynctask, и вы можете использовать ее в onPostExecute
 blackneko18 июн. 2013 г., 08:00
@Raghunandan, так где я должен это положить? o.o
 Raghunandan18 июн. 2013 г., 12:50
что вы подразумеваете под получением части? Просьба отредактировать свой вопрос и четко указать, что нужно. Я до сих пор не могу понять твой комнет
 Raghunandan18 июн. 2013 г., 12:40
Ваш комментарий неясен. что именно вы хотите сделать?
 Raghunandan18 июн. 2013 г., 07:55
Вы не можете обновить форму интерфейса пользователя doInbackground.
 Raghunandan18 июн. 2013 г., 08:04
проверить это в теме 4 шагаdeveloper.android.com/reference/android/os/AsyncTask.html
 blackneko18 июн. 2013 г., 07:48
@Raghunandan showMessage, я использую его, чтобы поместить сообщения в пузырь.
 Bigflow18 июн. 2013 г., 12:53
@blackneko Я немного растерялся, но вот что я думаю:ChatRoom.java это твое главное. У тебя есть Струны. И вам нужно передать / использовать их в классе Async. А потом..? Поправь меня, если я ошибаюсь.
 blackneko18 июн. 2013 г., 12:57
@ Bigflow, спасибо за ваш ответ. в ChatRoom.java у меня есть часть отправки сообщения и часть получения сообщения. часть отправки работает, когда я нажимаю кнопку отправки. но для принимающей части не работает, и, по моему мнению, я должен использовать AsyncTask, чтобы принимающая часть всегда работала в фоновом режиме, чтобы проверить приходящие сообщения. но я запутался, откуда часть я должен поместить это, и где я должен поместить это в Async. большое спасибо вам
 Raghunandan18 июн. 2013 г., 12:27
что вы хотите передать значения в асинхронную задачу? getIntent для класса, который расширяет активность. так что невозможно в асинхронном режиме. Так можете ли вы объяснить, что вы хотите?
 Raghunandan18 июн. 2013 г., 08:02
если вы хотите отобразить тост или сообщение, используйте runonuithread или сделайте это в onpostexecute
 blackneko18 июн. 2013 г., 13:01
@ Bigflow, хорошо, хорошего обеда.
 blackneko18 июн. 2013 г., 12:25
@Raghunandan, моя проблема сейчас сgetintent() Вы можете помочь мне с этой проблемой?
 blackneko18 июн. 2013 г., 12:48
@Raghunandan Я хочу поместить получающую часть в AsyncTask, но я запутался, откуда я должен поставить коды ... спасибо
 blackneko18 июн. 2013 г., 12:39
@ Рагхунандан, а? так что я просто положил код в asyncTask из этогоHttpClient httpClient = new DefaultHttpClient(); а выше из этого кода не надо?
 Bigflow18 июн. 2013 г., 12:59
@blackneko Сначала пойду на обед, потом посмотрю
 Bigflow18 июн. 2013 г., 13:45
@blackneko, если возможно, зайдите в этот чат, и мы поговорим дальше, здесь слишком много комментариев.chat.stackoverflow.com/rooms/31938/async-talk

Ответы на вопрос(2)

Решение Вопроса

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.
        }

    }

}
</myasynctaskparameters,>
 blackneko20 июн. 2013 г., 12:29
Стохастически, могу я задать вам еще вопрос? у меня есть проблема в этом [ссылка]stackoverflow.com/questions/17206453/...  Я не знаю, как разбить полученные сообщения. большое спасибо вам
 blackneko18 июн. 2013 г., 16:08
Стохастически, большое спасибо за ответ на мой вопрос: D. спасибо за объяснение, япопробую это ..: D
 Stochastically20 июн. 2013 г., 12:03
@blackneko ОК, хорошо :-), в этом случаеВы обычно набираете (чтобы указать, что этот ответ был полезен), и / или пометьте как 'ответ'?
 Stochastically20 июн. 2013 г., 12:02
@blackneko хорошо, хорошо,
 Stochastically19 июн. 2013 г., 14:14
@blackneko это помогло вообще?
 blackneko20 июн. 2013 г., 10:33
да, большое спасибо: D

использованиеAsyncTaskделаю свою работу вdoInBackground(...), Оттуда верните ваше сообщение и обработайте возвращенное значение в.onPostExecute(...)

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

Дон»читать поток вonPostExecute, сделать это как часть фоновой задачи. Вы'В противном случае заблокируем поток пользовательского интерфейса.

УвидетьonPostExecute.

 SK918 июн. 2013 г., 07:54
Чтение потока может быть длительной задачей, и вы можете запустить несколько таких задач. Если вы сделаете все это на onPostExecute (...), это предотвратит выполнение всех других задач в этом потоке, пока не завершит чтение. Так как тына нить пользовательского интерфейса здесь, пользовательский интерфейс будет зависать.
 blackneko18 июн. 2013 г., 11:24
Ой извините, и большое спасибо за вашу помощь
 blackneko18 июн. 2013 г., 08:05
спасибо за объяснение Я обновил свой код новым, но у меня проблема сgetIntent()где я должен положить этот код? Спасибо
 SK918 июн. 2013 г., 08:09
Установите ссылку на пакет вonPreExecute(), Я действительно думаю, что тыпытаемся бежать, прежде чем ты сможешь идти. Не спешите изучать документацию по Android, на многие из этих вопросов будут даны ответы, прежде чем онидаже спросил.
 blackneko18 июн. 2013 г., 07:46
Итак, я положил все коды части получения сообщения вdoInBackground(...)? Ооо спасибо
 SK918 июн. 2013 г., 08:56
На самом деле, обычноparams на самом деле это просто массив с одной записью,params[0], Чтобы передать результат наonPostExecute()сделай возвращениеdoInBackground(...) метод. Опять же, вы действительно должны прочитатьAsyncTask документация - этопроще, чем спекулировать вот так. Вы в долгу перед собой (и я сейчас).
 blackneko18 июн. 2013 г., 08:33
хммм, я думаю, я понял, я должен сделать этот кодString param2 = params[0]; вdoInBackground(...)? и для параметра 3 это становится [1] это так? О. Я только что узнал об этом из другого вопроса, но так ли это? просто хочу убедиться, правда ли это или нет .. спасибо
 blackneko18 июн. 2013 г., 07:51
Оуэ .. мой плохой ... я забыл изменить его, потому что я скопировал его из другого кода .. извините ..
 SK918 июн. 2013 г., 07:50
Да, конечно. Что если ваше сообщение очень, очень, очень, очень, очень, очень, очень, очень, очень длинное? Вы'заблокирую поток, читающий поток.
 blackneko18 июн. 2013 г., 07:52
Вы'заблокирую поток, читающий поток -> я нене понимаю эту часть. когда я положил весь кодdoInBackground(...) postexecute пуст? или что я должен положить туда? Ооо спасибо

Ваш ответ на вопрос