0

同じサーバーPHPスクリプトを使用してデータベースで何かを行い、応答してから、それに応じて画面を更新するAndroidアプリがあります。

約 60% の時間で高速です。しかし、電話の UI が長時間ハングすることがあり、ユーザーは何かがおかしいと考えて混乱を招きます。

また、アプリの画面が長時間ハングする場合は、それを参照するだけで、データがすべてそこにあることがわかります。問題は、データがデータベースに挿入された後です。

ここに私のAndroidコードがあります:

ListActivity を拡張する BaseListActivity を拡張する TopicActivity があります

TopicActivity では、最初に次のようにリストを設定しました。

DiscussionMessage d = new DiscussionMessage ();
d.setMessage( "Please wait while the discussion load..." );

discussion.add(d);
adapter = new ArrayAdapter<DiscussionMessage>( 
        this,R.layout.discussion_comments, 
        discussion);

setListAdapter(adapter);

次に、何かが発生したときに、次のような sendFeedback メソッドを呼び出します。

public void sendFeedback( String c , String user_id , String problem_id , 
        String recent_topic_id )
{  
    String[] params = new String[] 
            { "the_remote_url", 
             c , user_id, problem_id , recent_topic_id };

    AddComment task = new AddComment();
    task.execute(params);        
}

AddComment クラスは次のようになります。TopicActivity クラス内にあります。

public class AddComment extends AsyncTask<String, Void, String> 
{
    @Override
    protected String doInBackground(String... theParams) 
    {
        String myUrl = theParams[0];
        final String comment = theParams[1];
        final String user_id = theParams[2];
        final String problem_id = theParams[3];
        final String recent_topic_id = theParams[4];

        String charset = "UTF-8";           
        String response = null;

        try 
        {                           
            String query = String.format("comment=%s&user_id=%s&problem_id=%s&recent_topic_id=%s", 
                     URLEncoder.encode( comment, charset), 
                     URLEncoder.encode( user_id, charset), 
                     URLEncoder.encode( problem_id, charset), 
                     URLEncoder.encode( recent_topic_id, charset)
                     );             

            final URL url = new URL( myUrl + "?" + query );

            final HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            conn.setDoOutput(true); 
            conn.setRequestMethod("POST");

            conn.setDoOutput(true);
            conn.setUseCaches(false);

            conn.connect();

            InputStream stream = conn.getInputStream();
            byte[] stream_buffer = new byte[8196];
            int readCount;
            StringBuilder stream_builder = new StringBuilder();
            while ((readCount = stream.read(stream_buffer)) > -1) 
            {
                stream_builder.append(new String(stream_buffer, 0, readCount));
            }

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

        return response;
    }

    @Override
    protected void onPostExecute(String result) 
    {

        if ( result != null )
        {
         Toast.makeText(getApplicationContext(), "Could not get the current discussion.", Toast.LENGTH_LONG).show();                                
        }
        else
        {               
            try
            {
                JSONArray obj = new JSONArray(result);

                if ( obj != null )
                {
                    discussion.clear();

                    if ( obj.length() == 0 )
                    {
                        DiscussionMessage message = new DiscussionMessage ( );
                        message.setMessage("No messages in this discussion.");

                        discussion.add( message );
                    }
                    else
                    {
                        for ( int i = 0; i < obj.length(); i++ )
                        {
                            JSONObject o = obj.getJSONObject(i);

                            String comment = o.getString("comment");
                            String commenter_id = o.getString("commenter_id");
                            String comment_id = o.getString("comment_id");
                            String first_name = o.getString("first_name");
                            String last_name = o.getString("last_name");
                            String is_private = o.getString("is_private");

                            DiscussionMessage d = new DiscussionMessage ( );
                            d.setMessage(comment);
                            d.setAuthorId(commenter_id);
                            d.setMessageId(comment_id); 
                            d.setAuthorName(first_name);                                

                            discussion.add( d );
                        }
                    }
                    adapter.notifyDataSetChanged(); 

                    // Now clear the text area of text.
                    EditText comment = (EditText) findViewById(R.id.discussion_comment);  
                    comment.setText( "" );  
                }                   
            }
            catch ( Exception e )
            {
                   // Do something.
            }
        }
    }        
}        

これから私が間違っているかもしれないことを伝えることは可能ですか? Async または ListAdapter の使用方法に問題がありますか?

これを修正および/またはデバッグするためのアイデアは大歓迎です!

4

1 に答える 1

2

JSON の解析とDiscussionMessageオブジェクトの作成を に移動しますdoInBackground()。時間がかかり、バックグラウンド スレッドで実行する必要があるためです。DiscussionMessageオブジェクトを に注ぎ、Adapterを呼び出したままにnotifyDataSetChanged()しますonPostExecute()

さらに、Fuzzical Logic が指摘しているように、Log呼び出しを使用するか、Traceview を使用するかなど、どこに問題があるかを正確に判断する必要があります。たとえば、Web サービスの応答が遅いことがありますか?

于 2012-06-09T12:38:40.327 に答える