2015-07-27 2 views
4

Я пытаюсь решить эту проблему уже несколько недель, но я не могу ее решить, поэтому я действительно надеюсь найти помощь здесь.Android: Фрагмент слишком медленный при загрузке

Я создаю приложение, которое много работает с веб-сервером, поэтому есть много запросов. В моем фрагменте, названном «tab_profile», я вызываю 2 запроса в API и многие другие для загрузки изображений в свой пользовательский ListView.

Таким образом, моя проблема заключается в том, что этот фрагмент нуждается в 1-2 секундах при загрузке (соединение с лункой) и даже сбой при плохом соединении, например. 3G.

код как-то смотрит, как это (короткая версия, конечно):

public class tab_profile extends Fragment implements AdapterView.OnItemClickListener { 
private String imagepath = null; 
private ImageView imageview = null; 
View rootView = null; 
private ArrayList<PollItem> arrayPolls; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    rootView = inflater.inflate(R.layout.tab_profile, container, false); 

    final Button button_follower = (Button) rootView.findViewById(R.id.button_follower); 
    final Button button_following = (Button) rootView.findViewById(R.id.button_following); 
    final TextView text_username = (TextView) rootView.findViewById(R.id.text_username); 
    imageview      = (ImageView) rootView.findViewById(R.id.img_own_pp); 
    final Session session   = new Session(getActivity()); 
    final Network network   = new Network(getActivity()); 

    text_username.setText(session.getValue("username")); 
    if(session.getValue("username").length() < 3) { 
     getActivity().finish(); 
     return null; 
    } 

    JSONArray arr; 
    String res = network.POST("{\"token\":\"" + session.getValue("token") + "\"}", "profile.php"); 
    try { 
     JSONObject obj = new JSONObject(res); 
     arr = obj.getJSONArray("data"); 

     if (!obj.get("status").equals("false")) { 

      button_follower.setText("Follower\n" + arr.getJSONObject(0).getString("follower")); 
      button_following.setText("Following\n" + arr.getJSONObject(0).getString("following")); 

      if (arr.getJSONObject(0).getString("pp").equals("true")) { 
       network.setImageViewImage(imageview, "usermedia/pp/" + session.getValue("id")); 
      } 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    arrayPolls = new ArrayList<>(); 
    getList(); 

    //listeners here 

    return rootView; 
} 

Тогда вторая основная функция, которая называется "GetList()":

public void getList() { 
    Network netwok = new Network(getActivity()); 
    Session session = new Session(getActivity()); 

    String resp = netwok.POST("{\"token\":\""+session.getValue("token")+"\","+ 
      "\"get\":\"true\""+"}","mypoll.php"); 

    try { 
     JSONObject obj = new JSONObject(resp); 
     JSONArray arr = obj.getJSONArray("data"); 

     if(obj.get("status").equals("false")) { 
      return; 
     } 

     arrayPolls.clear(); 

     for(int i=0; i<arr.length(); i++) { 
      JSONObject ot = arr.getJSONObject(i); 
      PollItem tmp = new PollItem(ot.getInt("ID"),ot.getInt("userid"), 
        ot.getString("description"),ot.getString("username")); 
      arrayPolls.add(tmp); 
     } 
    } 
    catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    ListView list_poll_item = (ListView) rootView.findViewById(R.id.list_friend_poll); 
    PollOverviewItemAdapter adapter = new PollOverviewItemAdapter(getActivity(), arrayPolls, tab_profile.this, imageview); 
    list_poll_item.setAdapter(adapter); 
    list_poll_item.setOnItemClickListener(this); 
} 

И мои запросы отправленный этим Async. Функция:

private class POST_REQUEST extends AsyncTask<String, Integer, String>{ 
    protected String doInBackground(String... params) { 
     String line; 
     try { 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(params[0]); 

      ArrayList<NameValuePair> postParameters; 
      postParameters = new ArrayList<>(); 

      postParameters.add(new BasicNameValuePair("json", query)); 

      httpPost.setEntity(new UrlEncodedFormEntity(postParameters)); 

      HttpResponse httpResponse = httpClient.execute(httpPost); 
      HttpEntity httpEntity = httpResponse.getEntity(); 
      line = EntityUtils.toString(httpEntity); 

     } catch (UnsupportedEncodingException e) { 
      line = "<results status=\"error\"><msg>Can't connect to server</msg></results>"; 
     } catch (MalformedURLException e) { 
      line = "<results status=\"error\"><msg>Can't connect to server</msg></results>"; 
     } catch (IOException e) { 
      line = "<results status=\"error\"><msg>Can't connect to server</msg></results>"; 
     } 
     return line; 
    } 

    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
    } 
} 

и последняя функция:

public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { 
     ImageView bmImage; 

     public DownloadImageTask(ImageView bmImage) { 
      this.bmImage = bmImage; 
     } 

     protected Bitmap doInBackground(String... urls) { 
      String urldisplay = urls[0]; 
      Bitmap mIcon11 = null; 
      try { 
      InputStream in = new java.net.URL(urldisplay).openStream(); 
      mIcon11 = BitmapFactory.decodeStream(in); 
      } catch (Exception e) { 
       Log.e("Error", e.getMessage()); 
       e.printStackTrace(); 
      } 
      return mIcon11; 
     } 
     protected void onPostExecute(Bitmap result) { 
      bmImage.setImageBitmap(result); 
     } 
} 

Так что я думаю, что это были важные части моего кода. Я действительно надеюсь найти решение этой проблемы. И я много раз пробовал загружать первый мой пользовательский интерфейс, а затем позже данные с сервера, но это было то же самое. Я попробовал это, используя «onStart()».

Заранее спасибо ... :-)

+0

«даже сбой при плохом соединении, например, 3G» -> Можете ли вы опубликовать журнал сбоев? –

+0

Эй, @TrevorCarothers, это только на моем мобильном устройстве не на моей виртуальной машине. – yadbo

+0

Скорее всего, ваш компьютер использует ваш компьютер в Интернете. Пожалуйста, опубликуйте этот журнал аварий. –

ответ

1

Я думаю, что я нашел свое собственное решение. Я просто использовал свою функцию asnyc неправильно. Если я все делаю в onPostExecute(), приложение работает хорошо. Раньше я делал основную роль в обратном вызове doinbackground, поэтому он как-то застрял.

Смежные вопросы