Намеренная проблема, когда я пытаюсь вернуться к родительскому действию - PullRequest
1 голос
/ 26 января 2012

У меня есть ListView, который перечисляет список проектов (название проекта). Этот ListView инициализируется AsyncTask. Эта AsyncTask вызывается, когда начинается действие.

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.projects);
    portal = LoginActivity.getPortal();

    activity = this;

    viewListProjects = (ListView)findViewById(R.projects.list);
    create = (Button)findViewById(R.projects.create);

    listItem = new ArrayList<HashMap<String, String>>();

    this.currentItemClicked = null;

    adapter = new SimpleAdapter(
            this.getBaseContext(),
            listItem,
            R.layout.list_projects_item,
            new String[] {"title", "date"},
            new int[] {R.list_projects_item.title, R.list_projects_item.date}
            );

    viewListProjects.setAdapter(adapter);
    viewListProjects.setOnItemClickListener(itemListener);
    create.setOnClickListener(createListener);

    String message = "Loading...";
    Toast.makeText (this, message, Toast.LENGTH_SHORT).show ();
    CAsyncTask1 task = new CAsyncTask1 ();
    task.execute ();
}

private class CAsyncTask1 extends AsyncTask<Void, Void, Void> {

    protected Void doInBackground (Void... unused) {

        new Thread () {
            public void run () {
                listProjects = portal.getAllProjects();

                activity.runOnUiThread (new Runnable () {
                    public void run () {

                        if(listProjects == null){
                            Toast.makeText(getBaseContext(), "Connection Failed!", Toast.LENGTH_SHORT).show();
                            activity.finish();
                        }
                        else{
                            HashMap<String, String> map = new HashMap<String, String> ();
                            for(Info info : listProjects){
                                map.put("title", info.getName());
                                map.put("date", info.getCreation().toString());
                                listItem.add(map);
                                adapter.notifyDataSetChanged ();
                            }
                        }
                    } // run ();
                });
            } // run ();
        }.start ();

        return null;
    } // doInBackground ();

    protected void onPostExecute (final Void unused) {
        String message = "Project list updated!";
        Toast.makeText (activity, message, Toast.LENGTH_SHORT).show();
    } // onPostExecute ();

} // CAsyncTask ();

Я нажимаю кнопку Создать, чтобы создать новый проект

private OnClickListener createListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(ProjectsActivity.this, NewProjectActivity.class);
        startActivity(intent);
    }
};

Вот функция NewProjectActivity, позволяющая создать новый проект:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.new_project);

    portal = LoginActivity.getPortal();

    name = (EditText) findViewById(R.new_project.name);
    cancel = (Button) findViewById(R.new_project.cancel);
    create = (Button) findViewById(R.new_project.create);

    cancel.setOnClickListener(cancelListener);
    create.setOnClickListener(createListener);
}

private OnClickListener createListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        if(name.getText().toString() != ""){
            Project project = new Project();
            Info info = new Info(name.getText().toString());
            project.setInfos(info);
            portal.createProject(project);
            Intent intent = new Intent(NewProjectActivity.this, ProjectsActivity.class);
            startActivity(intent);
        }
        else{
            Toast.makeText(getBaseContext(), "Please give a name to your project.", Toast.LENGTH_SHORT).show();
        }
    }
};

При вызове Intent intent = new Intent (NewProjectActivity.this, ProjectsActivity.class) я получаю исключение:

01-26 03:23:23.493: E/AndroidRuntime(22440): FATAL EXCEPTION: main
01-26 03:23:23.493: E/AndroidRuntime(22440): java.lang.NullPointerException
01-26 03:23:23.493: E/AndroidRuntime(22440):    at  org.esir.android.ProjectsActivity$CAsyncTask1$1$1.run(ProjectsActivity.java:189)
01-26 03:23:23.493: E/AndroidRuntime(22440):    at  android.os.Handler.handleCallback(Handler.java:587)
01-26 03:23:23.493: E/AndroidRuntime(22440):    at android.os.Handler.dispatchMessage(Handler.java:92)
01-26 03:23:23.493: E/AndroidRuntime(22440):    at android.os.Looper.loop(Looper.java:130)
01-26 03:23:23.493: E/AndroidRuntime(22440):    at android.app.ActivityThread.main(ActivityThread.java:3687)
01-26 03:23:23.493: E/AndroidRuntime(22440):    at java.lang.reflect.Method.invokeNative(Native Method)
01-26 03:23:23.493: E/AndroidRuntime(22440):    at java.lang.reflect.Method.invoke(Method.java:507)
01-26 03:23:23.493: E/AndroidRuntime(22440):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
01-26 03:23:23.493: E/AndroidRuntime(22440):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
01-26 03:23:23.493: E/AndroidRuntime(22440):    at dalvik.system.NativeStart.main(Native Method)

Я пытался найти решение в течение 2 недель ... Поэтому, пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 26 января 2012

Я думаю, что activity.runOnUiThread (new Runnable () {

это действие строки должно быть нулевым.

Вы можете использовать обработчик или выбрать представление и опубликовать выполняемый объект вместо экземпляра действия.

...