【问题标题】:Cannot instantiate the type Android无法实例化 Android 类型
【发布时间】:2014-08-04 15:21:18
【问题描述】:

我想执行一个 AsyncTask 但它不工作

public class httpConn extends Activity{

LoginClass newLogin = new LoginClass();
LoginClass loginRslt = new LoginClass();
TextView data,strConn,strTry,bfrTry;
Button btnFetch;
String[] baseUrl;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_main);


    data = (TextView) findViewById(R.id.tvData);
    strConn = (TextView) findViewById(R.id.tvConn);
    strTry = (TextView) findViewById(R.id.tvTry);
    bfrTry = (TextView) findViewById(R.id.tvBfrTry);
    btnFetch = (Button) findViewById(R.id.bFetch);
    baseUrl[0] = " ";

    new ReadDataTask().execute(baseUrl);

    btnFetch.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            bfrTry.setText("before_try Success");


            strTry.setText("try Success");
        }       

    });


}

private abstract class ReadDataTask extends AsyncTask <String, integer, LoginClass>{

    @Override
    protected LoginClass doInBackground(String...params) {
        // TODO Auto-generated method stub

        XmlPullParserFactory factory;
        try{
            URL url = new URL(params[0]);

            URLConnection conn = url.openConnection();
            HttpURLConnection httpConn = (HttpURLConnection) conn;

            int responseCode = httpConn.getResponseCode();

            if(responseCode == HttpURLConnection.HTTP_OK){
                strConn.setText("Success");
                InputStream in = httpConn.getInputStream();

                factory = XmlPullParserFactory.newInstance();
                factory.setNamespaceAware(true);
                XmlPullParser xpp = factory.newPullParser();

                xpp.setInput(in, null);
                int eventType = xpp.getEventType();

                while(!(eventType == XmlPullParser.END_DOCUMENT))
                {
                    if(eventType == XmlPullParser.START_TAG &&
                            xpp.getName().equals("LoginModel")){

                        eventType = xpp.next();

                        while(!(eventType == XmlPullParser.END_TAG &&
                                xpp.getName().equals("LoginModel"))){

                            if(eventType == XmlPullParser.START_TAG &&
                                    xpp.getName().equals("_ErrorFound")){

                                newLogin.set_ErrorFound(xpp.nextText());
                                eventType = xpp.next();

                            }else if (eventType == XmlPullParser.START_TAG &&
                                    xpp.getName().equals("_UserID")){

                                newLogin.set_UserID(xpp.nextText());
                                eventType = xpp.next();

                            }else if (eventType == XmlPullParser.START_TAG &&
                                    xpp.getName().equals("_FullName")){

                                newLogin.set_FullName(xpp.nextText());
                                eventType = xpp.next();

                            }else if (eventType == XmlPullParser.START_TAG &&
                                    xpp.getName().equals("_ProfilePic")){

                                newLogin.set_ProfilePic(xpp.nextText());
                                eventType = xpp.next();

                            }else if (eventType == XmlPullParser.START_TAG &&
                                    xpp.getName().equals("_ProfilePicExtension")){

                                newLogin.set_ProfilePicExtension(xpp.nextText());
                                eventType = xpp.next();

                            }

                        }

                    }

                }

                return newLogin;
            }else{

                return null;
            }

        }catch(XmlPullParserException e){
            Log.d("PULLPARSER","XML Pull Parser Exception",e);
            return null;
        }catch(IOException ioe)
        {
            Log.d("PULLPARSER","IO Exception",ioe);
            return null;
        }
    }

    @Override
    protected void onProgressUpdate(integer... values) {
        // TODO Auto-generated method stub
        super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(LoginClass result) {
        // TODO Auto-generated method stub
        data.setText(result._FullName +" "+String.valueOf(result._UserID));
        super.onPostExecute(result);
    }

}

}

错误在一行

new ReadDataTask().execute(baseUrl);

据说

无法实例化类型 httpConn.ReadDataTask

我想要的只是从 web 服务获取数据并解析它并在我的屏幕上显示它

这是 LogCat

08-04 18:28:11.425: E/AndroidRuntime(22284): FATAL EXCEPTION: AsyncTask #1
08-04 18:28:11.425: E/AndroidRuntime(22284): Process: com.example.httpmob, PID: 22284
08-04 18:28:11.425: E/AndroidRuntime(22284): java.lang.RuntimeException: An error      occured while executing doInBackground()
08-04 18:28:11.425: E/AndroidRuntime(22284):    at android.os.AsyncTask$3.done(AsyncTask.java:300)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at java.lang.Thread.run(Thread.java:811)
08-04 18:28:11.425: E/AndroidRuntime(22284): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
08-04 18:28:11.425: E/AndroidRuntime(22284):    at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6024)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:820)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at android.view.View.requestLayout(View.java:16431)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at android.view.View.requestLayout(View.java:16431)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at android.view.View.requestLayout(View.java:16431)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at android.view.View.requestLayout(View.java:16431)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:352)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at android.view.View.requestLayout(View.java:16431)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at android.view.View.requestLayout(View.java:16431)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at android.widget.TextView.checkForRelayout(TextView.java:6600)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at android.widget.TextView.setText(TextView.java:3813)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at android.widget.TextView.setText(TextView.java:3671)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at android.widget.TextView.setText(TextView.java:3646)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at com.example.httpmob.httpConn$ReadDataTask.doInBackground(httpConn.java:77)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at com.example.httpmob.httpConn$ReadDataTask.doInBackground(httpConn.java:1)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at android.os.AsyncTask$2.call(AsyncTask.java:288)
08-04 18:28:11.425: E/AndroidRuntime(22284):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
08-04 18:28:11.425: E/AndroidRuntime(22284):    ... 4 more

【问题讨论】:

  • 它是抽象的,就是抽象的作用。

标签: java android android-asynctask


【解决方案1】:

ReadDataTask 是一个抽象类。这就是为什么你不能实例化它。

私有抽象类ReadDataTask

如果您希望创建此类的实例,则应删除 abstract 关键字。

【讨论】:

  • 你能看到 LogCat 吗?!告诉我
  • @Baybars 你不能在doInBackground 中直接操作UI(通过调用TextView.setText)。您可以在onPostExecute 中进行操作。
  • 我进行了编辑,但被拒绝了(不知道为什么):您还可以扩展 abstract 类并为所有标记为抽象的方法提供实现,从而使其具体化并且能够被实例化。
  • @diginoise 是的,我知道,但我看不出有任何理由将该类声明为抽象类,然后创建另一个子类以实例化它,因为您只在一处。
  • @Eran 明白。我只是指出,通常抽象类可以通过扩展它们变成具体的。保留 ReadDataTask 类抽象和修改它可能会破坏一些有效的架构决策是有可能的(尽管我不知道这两种方式)。
【解决方案2】:

乍一看: a) 它是抽象的——你不能实例化抽象类 b) 这甚至无法编译:

private abstract class ReadDataTask extends AsyncTask <String, integer, LoginClass>{

必须是:

 private abstract class ReadDataTask extends AsyncTask <String, Integer, LoginClass>{

【讨论】:

  • 实际上我认为integer 部分确实可以编译,它指的是 android.R.integer,它是一个类 - 尽管可能不是 OP 想要的。
  • @ligi:您的答案与 OP 相同。诶?为什么包括abstract
【解决方案3】:

ReadDataTask 是抽象类。

private abstract class ReadDataTask

【讨论】:

  • 虽然这似乎是他犯错的正当理由,但如果有解决方案或其他方式来做他试图做的事情,如果你能对这个问题发表评论,那将会很有帮助。
猜你喜欢
  • 2012-09-08
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 2014-12-30
  • 2019-07-26
  • 2013-09-27
  • 2015-04-30
  • 1970-01-01
相关资源
最近更新 更多