AsyncTask не возвращает значение - PullRequest
0 голосов
/ 27 февраля 2019

Код 1 работает, когда выполняется основное действие, но создает короткий черный экран при доступе к базе данных SQL.

Чтобы предотвратить черный экран, я переместил задачу SQL в AsyncTask, но данные, полученные из запроса, не передаются адаптеру.Я не получаю никакого результата (Код 2).Я не могу понять, что не так.Пожалуйста, помогите.

Код 1

public class CommentsView extends AppCompatActivity {

ArrayList<CommentObject> datamodels;
ListView listview;
ConnectionClassBatchRecord connectionClassBR;
String rcomments,rdoneby,rdateby,stepid,z;
private static CommentsListAdapter commentsAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_comments_view);
    connectionClassBR = new ConnectionClassBatchRecord();
    datamodels=new ArrayList<>();
    String step_Id = (String) getIntent().getExtras().get("Step_Id");
    stepid=step_Id;

    try {
        Connection con = connectionClassBR.CONN();
        if (con == null) {
            Log.v(TAG,"Error in connection with SQL server");
        } else {

            String query ="SELECT * FROM comments WHERE Step_Id='"+stepid+"'";
            PreparedStatement preparedStatement = con.prepareStatement(query);
            ResultSet rs =preparedStatement.executeQuery();

            while (rs.next()) {
                rcomments = rs.getString("Comment");
                rdoneby=rs.getString("DoneBy");
                rdateby=rs.getString("DoneByDate");
                CommentObject commentobject=new CommentObject(rcomments,rdoneby,rdateby);
                datamodels.add(commentobject);


            }
        }
    } catch (Exception ex) {
        //z = "Exceptions";
        z=ex.getMessage();
        Log.v(TAG,"Exceptionmessage"+z);
    }

    listview = (ListView) findViewById(R.id.commentslist);
    CommentsListAdapter commentsadapter = new CommentsListAdapter(this, datamodels);
    listview.setAdapter(commentsadapter);

}

Код 2

public class CommentsView extends AppCompatActivity {

ArrayList<CommentObject> datamodels;
ListView listview;
ConnectionClassBatchRecord connectionClassBR;
String rcomments,rdoneby,rdateby,stepid,z;
private static CommentsListAdapter commentsAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_comments_view);
    connectionClassBR = new ConnectionClassBatchRecord();
    datamodels=new ArrayList<>();
    String step_Id = (String) getIntent().getExtras().get("Step_Id");
    stepid=step_Id;

    FindcommentsAsyncTask findcommentsAsyncTask=new FindcommentsAsyncTask(this);
    findcommentsAsyncTask.execute(stepid);

    listview = (ListView) findViewById(R.id.commentslist);
    CommentsListAdapter commentsadapter = new CommentsListAdapter(this, datamodels);
    listview.setAdapter(commentsadapter);

}

private class FindcommentsAsyncTask extends AsyncTask<String,Void,ArrayList<CommentObject>> {

    String z,comm,sid;
    ResultSet result_rs;

    private ProgressDialog dialog;
    private Context context;
    private Activity activity;
    public FindcommentsAsyncTask(Activity activity) {
        this.activity = activity;
        this.context = activity;
        this.dialog = new ProgressDialog(context);
    }

    @Override
    protected void onPreExecute() {
        this.dialog.setMessage("Retrieving Data");
        this.dialog.show();
    }

    @Override
    protected ArrayList<CommentObject> doInBackground(String... params) {

        sid=params[0];

        try {
            Connection con = connectionClassBR.CONN();
            if (con == null) {
                Log.v(TAG,"Error in connection with SQL server");
            } else {

                String query ="SELECT * FROM comments WHERE Step_Id='"+sid+"'";
                PreparedStatement preparedStatement = con.prepareStatement(query);
                ResultSet rs =preparedStatement.executeQuery();

                while (rs.next()) {
                    rcomments = rs.getString("Comment");
                    rdoneby=rs.getString("DoneBy");
                    rdateby=rs.getString("DoneByDate");
                    CommentObject commentobject=new CommentObject(rcomments,rdoneby,rdateby);
                    datamodels.add(commentobject);


                }
            }
        } catch (Exception ex) {
            //z = "Exceptions";
            z=ex.getMessage();
            Log.v(TAG,"Exceptionmessage"+z);
        }

        return datamodels;
    }

    @Override
    protected void onPostExecute(ArrayList<CommentObject> mresult_rs)
    {
        passdata(mresult_rs);
        if (dialog.isShowing()) {
            dialog.dismiss();
        }
    }
}

private void passdata(ArrayList<CommentObject> mresult_rs){

    if (mresult_rs == null) {
        Toast.makeText(getApplication(), "No comments Found", Toast.LENGTH_LONG).show();
    } else {
        datamodels=mresult_rs;
    }
}

}

1 Ответ

0 голосов
/ 27 февраля 2019

Проблема в том, что onPostExecute получает пустой массив?Или что listView никогда не заполняется?Здесь я вижу гонку потоков, в то время как ваш AsyncTask все еще извлекает информацию, адаптер использует пустой массив для заполнения списка.А когда Asynctask завершает свою работу, он загружает результаты в модели данных, но никогда не уведомляет адаптер об изменении данных.Либо вызовите обновление для адаптера в passdata, либо создайте адаптер в passdata, тогда все будет работать правильно.

...