Android:为什么这个AsyncTask不会被执行....?

时间:2013-07-01 16:54:37

标签: android android-asynctask

我有这段代码,

应该CALL并等待

AsyncTask “getCreator”


private String getcreator(String id) {
        String creator = null;
        Log.e("","entro proprio in getcreator "+ id);
        if (id != null) {
            String srt = "";
            getCreator chn = new getCreator();
            chn.execute(id, null, null);
            try {
                srt = chn.get();
                Log.e("","predodo qulacosa da getcreator");
            } catch (Exception e) {
                Log.e("","exceltion in getcreator");
                e.printStackTrace();
            }

            JSONObject jObject = null;
            try {
                jObject = new JSONObject(srt);
                creator = jObject.getString("name");
            } catch (JSONException e) {
                // Json parse error usually
            }
        }
        return creator;
    }

但AsyncTask getCreator 从不执行其doinbackground()!!!


    public class getCreator extends AsyncTask<String, String, String> {
        public String res;

        @Override
        protected void onProgressUpdate(String... progress) {
        }

        @Override
        protected void onPostExecute(String result) {
        }

        @Override
        protected String doInBackground(String... symbol) {
            String result = "";
            Log.e("","entro in getcreator"+ symbol[0]);
            DefaultHttpClient client = new DefaultHttpClient();
            HttpParams httpParameters = new BasicHttpParams();
            // Set the timeout in milliseconds until a connection is
            // established.
            // The default value is zero, that means the timeout is not
            // used.
            int timeoutConnection = 3000;
            HttpConnectionParams.setConnectionTimeout(httpParameters,
                    timeoutConnection);
            // Set the default socket timeout (SO_TIMEOUT)
            // in milliseconds which is the timeout for waiting for data.
            int timeoutSocket = 5000;
            HttpConnectionParams
            .setSoTimeout(httpParameters, timeoutSocket);
            client.setParams(httpParameters);
            String srt = "";
            String url = "http://graph.facebook.com/".concat(symbol[0]);
            HttpGet getMethod = new HttpGet(url);
            try {
                ResponseHandler<String> responseHandler = new BasicResponseHandler();
                srt = client.execute(getMethod, responseHandler);

                result = srt;

            } catch (Throwable t) {
                // Toast.makeText(getApplicationContext(),
                // "Internet Problem", Toast.LENGTH_SHORT).show();
            }
            Log.e("","esco in getcreator");
            return result;
        }
    }

请帮助!!!!


要精确: doInBackground()甚至没有被执行....

方法private String getcreator(String id)定期调用,并生成其Log。

帮助!

4 个答案:

答案 0 :(得分:1)

日志说什么?哪里调用了getcreator(String id)方法?

(Cosa leggi nei log?Il metodo getcreator(String id)dove viene richiamato?)


[ - 等待OP - ]

你弄错了。您不必从AsyncTask中“获取”某些内容。

srt = chn.get();

AsycnTask正在执行一个异步任务,所以你启动它就是这样。在onPostExecute()中,“更新”完成任务。

(正如评论所指出的那样,你可以做到这一点,但这很糟糕)

首先,构造函数chn.execute(id, null, null)中的这三个参数不是顶部AsyncTask<String, String, String>上的参数。它们是您在doInBackground(String... symbol)中获得的参数。因此symbol[0]idsymbol[1]symbol[2]为空

只是为了知识的缘故:

Log.e -> ERROR
Log.d -> DEBUG
Log.i -> INFO

你实际上是在“调试”,所以你应该使用Log.d

答案 1 :(得分:1)

尝试使用new getCreator().execute(id, "", ""); 并在onPostExecute写“Log.i("","post execute");” 发布日志猫后

答案 2 :(得分:1)

调用get()的{​​{1}}方法将阻塞主线程并等待返回结果。这有效地使AsyncTask成为同步操作,在这种情况下使用AsyncTask没有意义。

我能想到使用AsyncTask方法的唯一原因是来自主(UI)线程以外的线程,尽管我想不出有很多理由这样做。

http://developer.android.com/reference/android/os/AsyncTask.html

您可以在get()中返回结果。 doInbackground计算的结果是doInBackground()的参数。

因为你的asynctask是你活动的内部类。您可以将onPostExecute声明为您的活动类变量并使用相同的变量。

String create

的AsyncTask

private String getcreator(String id) {
 if(id!=null) // make sure id is not null
 { 
 GetCreator chn = new GetCreator();
 chn.execute(id); 
 // call execute to invoke asynctask
 // there is no need to pass null
 // pass the id to doInBackground()  
 }
}

答案 3 :(得分:1)

首先,方法getcreator()的设计是错误的。

AsyncTask将异步执行,但您的第一个线程(UI Thread?)将等待结果。 AsyncTask在这种情况下毫无用处。

您可能应该在onPostExecute()的{​​{1}}方法中更新您的UI(或根据结果执行任何操作),而不会阻止第一个帖子。