我知道这个标题已经有很多问题,但是我仍然没有找到适合我的情况的解决方案。

我有以下代码从在线数据库获取用户数据。如标题中所述,问题是AsyncTask无法启动。

这是我的代码:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getData(); // retrieves "friends" data from database
    FloatingActionButton btn3 = (FloatingActionButton) findViewById(R.id.button_add_new_friend);
    btn3.setBackgroundTintList(getResources().getColorStateList(R.color.Blonde));
    btn3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            LayoutInflater layoutInflater = LayoutInflater.from(profile.this);
            View promptView = layoutInflater.inflate(R.layout.input_new_friend, null);
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(profile.this);
            alertDialogBuilder.setView(promptView);

            final EditText editText1 = (EditText) promptView.findViewById(R.id.edittext_addnewfriend);

            // setup a dialog window
            alertDialogBuilder.setCancelable(false)
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                        StrictMode.setThreadPolicy(policy);

                        InputStream is = null;

                        // add values to the database
                        String friend = "" + editText1.getText();

                        // Verify the user in the USERS database - get users data from the dabase
                        GetDataJSON g = new GetDataJSON();
                        g.execute();
                        if (friends.contains(friend)) // if you are already friends with that user
                            Toast.makeText(getApplicationContext(), "You are already friends with that user!",
                                Toast.LENGTH_LONG).show();
                        else {
                            if (!users.contains(friend)) // the user doesn't exist in our database
                                Toast.makeText(getApplicationContext(), "That user doesn't exist! You either haven't introduced the right email or he's not a registered user within Poinder.",
                                    Toast.LENGTH_LONG).show();
                        else // the user exists so we add him to the friends list
                        {
                            //do something
                        }
}

// Getting the users
protected void showList2(){
    try {
        JSONObject jsonObj = new JSONObject(myJSON);
        people = jsonObj.getJSONArray(TAG_RESULTS);

        for(int i=0;i<people.length();i++){
            JSONObject c = people.getJSONObject(i);
            String user = c.getString(TAG_USER);
            String email = c.getString(TAG_EMAIL);
            Double location_latitude = c.getDouble(TAG_LATITUDE);
            Double location_longitude = c.getDouble(TAG_LONGITUDE);

            users.add(email);
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }

}

// Getting the users
private class GetDataJSON extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... params) {
        DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams());
        HttpPost httppost = new HttpPost("http://xxxxxxx/friends_out.php");

        // Depends on your web service
        httppost.setHeader("Content-type", "application/json");

        InputStream inputStream = null;
        String result = null;
        try {
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();

            inputStream = entity.getContent();
            // json is UTF-8 by default
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
            StringBuilder sb = new StringBuilder();

            String line = null;
            while ((line = reader.readLine()) != null)
            {
                sb.append(line + "\n");
            }
            result = sb.toString();
        } catch (Exception e) {
            // Oops
        }
        finally {
            try{if(inputStream != null)inputStream.close();}catch(Exception squish){}
        }
        return result;
    }

    @Override
    protected void onPostExecute(String result){
        myJSON=result;
        showList2();
    }
}

知道我应该使用其他什么方法吗?或者最好是我应该如何修改此代码以使其工作以及为什么我的AsyncTask永不启动的任何想法?

编辑:我应用了下面提到的所有建议,不幸的是,到目前为止它们都没有起作用(我的AsyncTask仍然无法启动)。

另一个问题:在同一 Activity 中使用多个AsyncTask与我的问题有关系吗?

最佳答案

由于(我假设)其他建议的解决方案均无效,因此我怀疑您的问题出在AsyncTask的执行方式上。如果多个AsyncTask在同一个Activity中执行(例如在您的应用中),则这些AsyncTask将不会并行执行。他们将一个接一个地执行。
我怀疑您的其他AsyncTask是否已长时间运行,因此GetDataJSON AsyncTask正在等待其他任务完成。
解决方案是启用AsyncTask的并行执行。使用以下代码并行执行AsyncTasks。

GetDataJSON g = new GetDataJSON();
g.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
从AsyncTask文档:

希望这可以帮助。

关于android - Android-AsyncTask无法执行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31957815/

10-13 05:31