0

私はAsynctaskを使用して、autocompletetextviewでサーバーからリストを取得していますが、強制的に閉じています。私のコードは次のとおりです。

public class Aixclass extends Activity 
{

    protected Void[] params1;
    String[] strarray;
    TextView myXmlContent;
    AutoCompleteTextView actv;
    static final String URL="http://cympac.com/apps/xmlfile.xml";
    static final String KEY_COMMAND = "command"; // parent node
    static final String KEY_WORD = "word";
    static final String KEY_EXPLANATION = "explanation";
    String stringXmlContent;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.newaix);
        TextView tv1=(TextView)findViewById(R.id.textView1);
        TextView tv2=(TextView)findViewById(R.id.textView2);
        TextView tv4=(TextView)findViewById(R.id.textView4);
        //TextView tv5=(TextView)findViewById(R.id.textView5);
        String text="Cympac Software Solutions Pvt Ltd. www.cympac.com";
        tv4.setText(text);
        tv4.setTextColor(Color.RED);
        Pattern pattern=Pattern.compile("www.cympac.com");
        Linkify.addLinks(tv4,pattern,"http://");
        tv4.setTextColor(Color.GREEN);


         actv=(AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
        Button b1=(Button)findViewById(R.id.button1);
        Button b2=(Button)findViewById(R.id.button2);
        Button b3=(Button)findViewById(R.id.button3);
        Button b4=(Button)findViewById(R.id.button4);

        actv = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
        actv.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                new Mytask1().execute(params1);

            }
        });





    }



    private class Mytask1 extends AsyncTask<Void,Void,String[]>
    {

        @Override
        protected String[] doInBackground(Void... params1) 
    {
        try{             
            URL url=new URL("http://cympac.com/apps/aixcomm.txt");
            BufferedReader buf = new BufferedReader(new InputStreamReader(url.openStream())); 

               String readString = new String();   


               ArrayList<String> val = new ArrayList();
               int i=0;

               while ((readString = buf.readLine()) != null) {
                   Log.d("line: ", readString);   
                   val.add(readString);
                   Log.d("values", val.get(i).toString());
                   i++;
               }

               /*String[] strarray = new String[val.size()];
                strarray = val.toArray(strarray);
                for(String s : strarray)
                Toast.makeText(getBaseContext(), "data:"+s, Toast.LENGTH_SHORT).show();*/


               String[] strarray = new String[val.size()];/// SEE THIS
               strarray = val.toArray(strarray);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return strarray;
    }
        protected void onPostExecute(String[] result) 
        {
            ArrayAdapter<String> adapter = 
                new ArrayAdapter<String>(Aixclass.this,android.R.layout.select_dialog_item,strarray);
             actv.setThreshold(1);
             actv.setAdapter(adapter);
            super.onPostExecute(result);
        }





    }






}

しかし、私は強制的に閉じています。非同期タスクを使用せずにプログラムを実行すると、エミュレータで動作しましたが、実際のデバイスでは失敗しました。したがって、aynctaskを使用しましたが、上記のコードは強制的に閉じています。autocompletetextviewをクリックすると、「強制的に閉じる」が表示されます。 logcatの出力は次のとおりです。

 08-30 14:44:40.894: E/AndroidRuntime(1026): FATAL EXCEPTION: main
08-30 14:44:40.894: E/AndroidRuntime(1026): java.lang.NullPointerException
08-30 14:44:40.894: E/AndroidRuntime(1026):     at java.util.Arrays$ArrayList.<init>(Arrays.java:49)
08-30 14:44:40.894: E/AndroidRuntime(1026):     at java.util.Arrays.asList(Arrays.java:171)
08-30 14:44:40.894: E/AndroidRuntime(1026):     at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:125)
08-30 14:44:40.894: E/AndroidRuntime(1026):     at com.example.cd16.Aixclass$Mytask1.onPostExecute(Aixclass.java:205)
08-30 14:44:40.894: E/AndroidRuntime(1026):     at com.example.cd16.Aixclass$Mytask1.onPostExecute(Aixclass.java:1)
08-30 14:44:40.894: E/AndroidRuntime(1026):     at android.os.AsyncTask.finish(AsyncTask.java:417)
08-30 14:44:40.894: E/AndroidRuntime(1026):     at android.os.AsyncTask.access$300(AsyncTask.java:127)
08-30 14:44:40.894: E/AndroidRuntime(1026):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
08-30 14:44:40.894: E/AndroidRuntime(1026):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-30 14:44:40.894: E/AndroidRuntime(1026):     at android.os.Looper.loop(Looper.java:123)
08-30 14:44:40.894: E/AndroidRuntime(1026):     at android.app.ActivityThread.main(ActivityThread.java:4627)
08-30 14:44:40.894: E/AndroidRuntime(1026):     at java.lang.reflect.Method.invokeNative(Native Method)
08-30 14:44:40.894: E/AndroidRuntime(1026):     at java.lang.reflect.Method.invoke(Method.java:521)
08-30 14:44:40.894: E/AndroidRuntime(1026):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-30 14:44:40.894: E/AndroidRuntime(1026):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-30 14:44:40.894: E/AndroidRuntime(1026):     at dalvik.system.NativeStart.main(Native Method)
4

2 に答える 2

3

問題はこの行にありwhile ((readString = buf.readLine()) != null) {ます。ポーブレムだと思いString readString=new String()ます。

StringをString readString;として宣言するだけです。

これはあなたを助けるかもしれません

于 2012-08-30T10:40:41.810 に答える
0

問題はdoInBackgroundにあり、複数のtry catchを使用しているときにnullとして値を取得しています。たとえば、そのうちの1つが失敗した場合、後でいくつかの操作に使用すると、nullポインター例外が発生します。エラーが発生した時点でデバッグし、値の読み取りなどの操作にnullチェックを入れるのが最善です。

strarray = new String[val.size()];/// SEE THIS
   strarray = val.toArray(strarray);
   return strarray;

ここのように、valに何らかの値があると想定していますが、コードの残りの部分がtry catchにあるため、nullになる可能性があります。これがエラーのポイントである可能性があります。DoInBackgroundのすべてのコードに単一のTryCatchブロックを配置します。

于 2012-08-30T08:48:34.150 に答える