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);
        }





    }






}

但我正在强制关闭。不使用 asynctask 我运行程序,它在模拟器上工作但在真实设备上失败。所以我使用 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 中,你得到一些值为 null 你正在使用多个 try catch 假设其中一个失败了,当你将它用于某些操作时会发生什么,你得到空指针异常。最好的办法是调试您在什么时候收到错误并对操作进行空检查,例如读取值等。

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

就像这里你假设 val 有一些价值但它可能是 null 因为你的其余代码在 try catch 中,这可能是错误点。在 DoInBackground 中的所有代码上放置一个 Try Catch 块。

于 2012-08-30T08:48:34.150 回答