2016-09-24 5 views
1

У меня проблема. Я пытаюсь создать асинхронную задачу Activity Activity и после выполнения вызываемого метода adapterCreate() класса Profile.class, где создается адаптер. Необходимо передать контекст в первом параметре метода. Здесь, например, если я нахожусь в строке для вызова метода в классе, все работает хорошо, если передача contex «это». И если я вызываю из асинхронных задач, приложение завершает работу. Я не знаю что делать. Я надеюсь на вашу помощь. Спасибо!Когда вы вызываете метод асинхронных задач, приложение завершает работу

Profile.class

public class Profile extends AppCompatActivity { 



    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_application); 

     new ParseTask(this).execute(); 

    } 



public void adapterCreate(Activity context){ 

    String[] str1 = {"mesages1", "messages2"}; 
    String[] str2 = {"photo1", "photo2"}; 
    String[] str3 = {"name1", "name2"}; 

    adapter = new LazyAdapter(context, str1, str2, str3); 
    list.setAdapter(adapter); 

} 

} 

ParseTask.class

public class ParseTask extends AsyncTask<Void, Void, String> { 

    HttpURLConnection urlConnection = null; 
    BufferedReader reader = null; 
    String resultJson = ""; 

    Activity act; 

    public ParseTask (Activity context){ 
     this.act = context; 
    } 

    @Override 
    protected String doInBackground(Void... params) { 
     try { 
      URL url = new URL("/friends.json"); 

      urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.setRequestMethod("GET"); 
      urlConnection.connect(); 

      InputStream inputStream = urlConnection.getInputStream(); 
      StringBuffer buffer = new StringBuffer(); 

      reader = new BufferedReader(new InputStreamReader(inputStream)); 

      String line; 
      while ((line = reader.readLine()) != null) { 
       buffer.append(line); 
      } 

      resultJson = buffer.toString(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return resultJson; 
    } 

    @Override 
    protected void onPostExecute(String strJson) { 
     super.onPostExecute(strJson); 

     new Profile().chatCreate(); 

    } 
} 

LazyAdapter.class

public class LazyAdapter extends BaseAdapter { 

    private Activity activity; 
    private String[] messages; 
    private String[] photo; 
    private String[] name; 
    private static LayoutInflater inflater=null; 
    //public ImageLoader imageLoader; 

    public LazyAdapter(Activity a, String[] messages_c, String[] photo_c, String[] name_c) { 
     activity = a; 
     messages=messages_c; 
     photo = photo_c; 
     name = name_c; 
     inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     //imageLoader=new ImageLoader(activity.getApplicationContext()); 
    } 

    public int getCount() { 
     return name.length; 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     View vi=convertView; 
     if(convertView==null) vi = inflater.inflate(R.layout.listview_row, null); 

     TextView name_c = (TextView)vi.findViewById(R.id.name_c); 
     TextView content_c = (TextView)vi.findViewById(R.id.content_c); 
     ImageView image = (ImageView)vi.findViewById(R.id.image); 
     name_chat.setText(name[position]); 
     content_chat.setText(messages[position]); 
     return vi; 
    } 
} 

LogCat войти

09-24 16:49:10.821 7969-7969/package E/AndroidRuntime: FATAL EXCEPTION: main 
java.lang.NullPointerException 
    at package.Profile.chatCreate(Profile.java:645) 
    at package.ParseTask.onPostExecute(ParseTask.java:108) 
    at package.ParseTask.onPostExecute(ParseTask.java:21) 
    at android.os.AsyncTask.finish(AsyncTask.java:631) 
    at android.os.AsyncTask.access$600(AsyncTask.java:177) 
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4745) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
    at dalvik.system.NativeStart.main(Native Method) 
+2

post logcat log – Nikhil

+0

Добавлено, смотрите. –

+0

где chatCreate() Метод –

ответ

3

Вы абсолютно положительно не могу это сделать:

new Profile().chatCreate(); 

Profile является Activity, который является Android компонент. Вы не можете сами создавать компоненты Android, используя new. Только инфраструктура Android может создавать компоненты Android, потому что они должны установить их Context, прежде чем их можно будет использовать.

Если вы хотите вызвать метод на Activity, вам необходимо использовать экземпляр Activity, который уже был создан платформой Android.

+0

И что мне делать? –

+0

Ваша 'AsyncTask' создана классом' Profile', и она передает ссылку на себя в конструкторе. Просто запустите 'act' как' Profile' и вызовите 'chatCreate()', как это: '((Профиль) act) .chatCreate();'. –

0

когда вы говорите this в деятельности в контексте деятельности посылаемого, но тот не случай с задачами асинхронными (здесь this относится к самой асинхронной задачи), так что вы должны сделать yourActivity.this.

+0

Это не помогает –