2

私はこのコードを持っていますが、エラーが何であるかわかりません: package com.shoukurasou;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.text.Html;
import android.view.View;
import android.view.WindowManager;
import android.widget.*;

public class ShoutActivity extends Activity {

    public void update_shouts() throws IOException{

            URL url;
            String inputLine = null;
            url = new URL("http://MYSITE/shouts.php");
            URLConnection conn = url.openConnection();
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "Windows-1252"));
            inputLine = br.readLine().toString();

            List<String> shouts = new ArrayList<String>(); 

            String[] shoutsplit = inputLine.split("<item>");

            for(int i = 0; i < shoutsplit.length; i++){

                String username = shoutsplit[i].split("<info>")[0].toString();
                String shout = shoutsplit[i].split("<info>")[1].toString();

                shouts.add(username+": "+Html.fromHtml(shout));
            }

            final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, shouts);
            final ListView list = (ListView) findViewById(R.id.list);
            if(list != null){

                ShoutActivity.this.runOnUiThread(new Runnable() {

                    public void run() {
                        list.setAdapter(null);
                        list.setAdapter(adapter);
                    }
                });

            }else{
                new AlertDialog.Builder(this).setTitle("Erro!").setMessage("Este erro é comum, por favor, feche e abra o aplicativo novamente.").setNeutralButton("Ok", null).show();
            }

            br.close();            
    }

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_shout);
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

        Timer t = new Timer();
        t.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
                try {
                    update_shouts();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }, 0, 1000);

    }    

    public void sendShout(View v) throws IOException{

        String login = null;
        String password = null;
        String edit1value = null;

        Bundle extras = getIntent().getExtras();
        login = extras.getString("login").toString();
        password = extras.getString("password").toString();

        EditText edit1 = (EditText) findViewById(R.id.editText1);
        edit1value =  URLEncoder.encode(edit1.getText().toString());

        URL shout;
        shout = new URL("http://MYSITE/send_shout.php?username="+login+"&password="+password+"&shout="+edit1value);
        URLConnection connection_shout = shout.openConnection();
        BufferedReader brshout = new BufferedReader(new InputStreamReader(connection_shout.getInputStream()));

        edit1.setText("");

    }

}

エラー:

11-11 01:34:34.649: E/AndroidRuntime(272): 致命的な例外: Timer-0 11-11 01:34:34.649: E/AndroidRuntime(272): java.lang.ArrayIndexOutOfBoundsException 11-11 01:34: 34.649: E/AndroidRuntime(272): com.shoukurasou.ShoutActivity.update_shouts(ShoutActivity.java:40) 11-11 01:34:34.649: E/AndroidRuntime(272): com.shoukurasou.ShoutActivity$2.run( ShoutActivity.java:76) 11-11 01:34:34.649: E/AndroidRuntime(272): java.util.Timer$TimerImpl.run(Timer.java:289) で

何がエラーなのかわかりません。私の英語について申し訳ありません。私はブラジル出身です。thx

4

2 に答える 2

0

スレッドで UI を変更するには、ハンドラーを実装する必要があります。

まず、次を追加します。

Looper.prepare();

timersrun()メソッドの先頭に。

次に、次のようなハンドラーを作成できます。

Handler handler = new Handler();

次に、ハンドラーが次のように実行されるように、リストビュー コードを runnable 内に追加する必要があります。

handler.post(new Runnable(){
@Override
public void run(){
ListView list = (ListView) findViewById(R.id.list);
            list.setAdapter(null);
            list.setAdapter(adapter)
}

それはあなたの問題を解決するはずです!

于 2013-11-10T20:09:42.197 に答える
0

getView()アダプターから UI を管理するため、この行は UI スレッドで呼び出す必要があります。

この方法で実行してみてください:

ShoutActivity.this.runOnUiThread(new Runnable() {

    public void run() {
        list.setAdapter(adapter);
    }
});

listそしてadapterマークする必要がありますfinal

于 2013-11-10T20:08:43.410 に答える