精华内容
下载资源
问答
  • Android 更新UI的两种方式

    千次阅读 2016-08-19 16:58:17
    Android 更新UI的两种方法——handler和runOnUiThread() 在Android开发过程中,常需要更新界面的UI。而更新UI是要主线程来更新的,即UI线程更新。如果在主线线程之外的线程中直接更新页面显示常会报错。抛出异常:...

    Android 更新UI的两种方法——handler和runOnUiThread()

    在Android开发过程中,常需要更新界面的UI。而更新UI是要主线程来更新的,即UI线程更新。如果在主线线程之外的线程中直接更新页面显示常会报错。抛出异常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
    只有原始创建这个视图层次(view hierachy)的线程才能修改它的视图(view)

    方法一:

    在Activity.onCreate(Bundle savedInstanceState)中创建一个Handler类的实例, 在这个Handler实例的handleMessage回调函数中调用更新界面显示的函数。
    方法二:
    利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给Activity.runOnUiThread(Runnable)。 这样Runnable对像就能在ui程序中被调用。如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作是发布到事件队列的UI线程

    代码如下:

    package com.viewpagerindicator.transitionframework;
    
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class SixActivity extends AppCompatActivity {
    
        private UIHandler mUiHandler;
        private TextView mTvHandler;
        private TextView mTvRunonuithread;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_six);
    
            mTvHandler = (TextView) findViewById(R.id.tv_handler);
            mTvRunonuithread = (TextView) findViewById(R.id.tv_runonuithread);
            Button btnHandler = (Button) findViewById(R.id.btn_handler);
            Button btnRunonuithread = (Button) findViewById(R.id.btn_runonuithread);
    
            btnHandler.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                    mUiHandler =  new UIHandler();
                    UIThread uiThread = new UIThread();
                    uiThread.start();
    
                }
            });
    
            btnRunonuithread.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
           //此处其实可以不需要加入runOnUiThread,只是为了介绍runOnUiThread而已
                    SixActivity.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mTvRunonuithread.setText("这是第二个UI");
                        }
                    });
    
                }
            });
    
        }
    
        private class UIHandler extends Handler {
    
            @Override
            public void handleMessage(Message msg) {
    
                Bundle bundle = msg.getData();
                String color = bundle.getString("color");
                mTvHandler.setText(color);
    
            }
        }
    
        private class UIThread extends Thread{
            @Override
            public void run() {
                super.run();
    
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Message msg = new Message();
                Bundle bundle = new Bundle();
                bundle.putString("color","黄色");
                msg.setData(bundle);
                SixActivity.this.mUiHandler.sendMessage(msg);
    
            }
        }
    
    
    }
    

    展开全文
  • Android更新UI的两种方法(一)

    千次阅读 2018-01-19 15:12:25
    Android更新UI的两种方法(一)在Android开发中,通常将联网、i/o、复杂的算法、查询数据库(大量数据)等耗时操作放在子线程中进行,这样可以避免ANR常(application not responing)。在子线程的操作过程中常常...

    Android更新UI的两种方法(一)

    在Android开发中,通常将联网、i/o、复杂的算法、查询数据库(大量数据)等耗时操作放在子线程中进行,这样可以避免ANR常(application not responing)。在子线程的操作过程中常常需要更新UI,而更新UI操作主要有两种方法。一种是直接在子线程中覆盖runOnUiThread()方法,另一种则是使用Android的消息机制。
    本文先介绍第一种方法:
    界面如图所示:

    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        private Button button;
        private TextView textView;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            button = (Button) findViewById(R.id.bt_button);
            textView = (TextView) findViewById(R.id.tv_message);
            button.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.bt_button:
                    new workThread().start();
                    break;
                default:
                    break;
            }
        }
    
        private class workThread extends Thread{
    	//servlet地址
            final String serverPath="http://xxx.xxx.xxx.xxx:8080/ServletTest/MainMessage";
            @Override
            public void run() {
                super.run();
                try {
                    URL url=new URL(serverPath);
                    HttpURLConnection httpURLConnection=(HttpURLConnection) url.openConnection();
                    httpURLConnection.setConnectTimeout(5000);
                    httpURLConnection.setRequestMethod("GET");
                    httpURLConnection.setRequestProperty("contentType","utf-8");
                    final int responseCode=httpURLConnection.getResponseCode();
                    if (responseCode==200){//200==OK
                        InputStream inputStream=httpURLConnection.getInputStream();
                        BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream,"GB2312"));//设置编码格式
                        final String responseMsg=bufferedReader.readLine();
                        runOnUiThread(new Runnable() {//使用runOnUIThread()方法更新主线程
                            @Override
                            public void run() {
                                textView.setText(responseMsg);
                            }
                        });
                        bufferedReader.close();
                        httpURLConnection.disconnect();
                    }else {
                        Toast.makeText(MainActivity.this,"responseCode="+responseCode,Toast.LENGTH_SHORT).show();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    点击按钮执行更新操作后界面如图所示:

    展开全文
  • Android 更新UI的两个方法

    千次阅读 2013-07-08 00:11:36
    Android 更新UI的两个方法 在Android的开发过程中,常常需要适时的更新UI。Androd中的UI是在主线程中更新的。如果在主线程之外的线程中直接更新,就会出现报错并抛出异常: android.view.ViewRoot$...

    Android 更新UI的两个方法

    在Android的开发过程中,常常需要适时的更新UI。Androd中的UI是在主线程中更新的。如果在主线程之外的线程中直接更新,就会出现报错并抛出异常:

    android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

    只有原始创建这个视图层次(view hierachy)的线程才能修改它的视图(view)

    那么Android中该如何更新UI呢?

    <1>. 利用Activity.runOnUiThread(Runnable)把更新UI的代码写在Runnable中

          操作机制:如果当前线程是UI线程,那么该行动立即执行;如果不是,操作发布到事件队列的UI线程。


    RunOnUiThreadDemo


    布局文件:activity_mai.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity" >
    	    <TextView
    	        android:layout_width="match_parent"
    	        android:layout_height="wrap_content"
    	        android:text="@string/hello_world" 
    	        />
    	    <Button 
    	        android:id="@+id/btn"
    	        android:layout_width="match_parent"
    	        android:layout_height="wrap_content"
    	        android:text="点击更新界面"
    	        />
    	    <TextView
    	        android:id="@+id/input_str"
    	        android:layout_width="wrap_content"
    	        android:layout_height="wrap_content"
    	        />
    
    
    </LinearLayout>
    


    Java文件:MainActivity.java

    package com.zsl.runonuithreaddemo;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.text.Editable;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		final TextView viewText = (TextView)findViewById(R.id.input_str);
    		Button btn = (Button)findViewById(R.id.btn);
    		btn.setOnClickListener(new OnClickListener() {
    
    			@Override
    			public void onClick(View arg0) {
    				// TODO Auto-generated method stub
    				MainActivity.this.runOnUiThread(new Runnable() {
    
    					@Override
    					public void run() {
    						// TODO Auto-generated method stub
    						char[] str = "Android is intresting...".toCharArray();
    						viewText.setText(str, 0, str.length);
    					}
    				});
    				
    			}
    		});
    	}
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.main, menu);
    		return true;
    	}
    
    }
    


    运行结果:

    点击Button之前:                                       点击Button之后:

                  


    <2>. 在Activity.onCreate(Bundle savedInstanceState)中创建一个Handler类的实例,利用Handler的回调实现。

          具体参见:Android Handler消息传递机制

    事实上,我从这里的一篇英文文章中了解到,Android的handler中也是通过runOnUiThread实现的。


    展开全文
  • Android 更新模块 自定义Update 写这个总结是因为遇到个Android系统兼容的BUG Android项目原本使用的是API提供的下载方法 如下: DownloadManager downloadManager = (DownloadManager) getSystemService...
    Android 更新模块 自定义Update



    写这个总结是因为在项目中碰到了Android系统兼容的BUG  

    Android项目原本使用的是API提供的下载方法  
    如下:
    			DownloadManager downloadManager = (DownloadManager) getSystemService(Activity.DOWNLOAD_SERVICE);
    			DownloadManager.Request request = new Request(Uri.parse(dl));
    			request.setTitle(getString(R.string.app_name));
    			request.setDestinationUri(getDownloadName(getIntent().getStringExtra("version_name")));
    			long reference = downloadManager.enqueue(request);
    			UserSettingHelper.getInstance().setUpgradeKey(reference);


    但如三星  华为 等手机它自带的系统中 删除掉了google服务从而导致崩溃 


    在网上找了资料 然后改吧改吧总算快速修复了bug:

    1) 主activity 
    package com.example.updataapk;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    
    /**
     * 
     * @author baozi
     * 
     */
    public class MainActivity extends Activity {
    
    	// 地址
    	private String dl = "http://17shihui.cn/download/shihui.apk";
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		Function_Utility.setAppContext(getApplicationContext());
    
    		findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
    
    			@Override
    			public void onClick(View v) {
    				Uri uri = Uri.parse(dl);
    				Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    				startActivity(intent);
    			}
    		});
    		findViewById(R.id.button2).setOnClickListener(new OnClickListener() {
    
    			@Override
    			public void onClick(View v) {
    				try {
    					download(dl);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    
    	private void download(String dl) throws Exception {
    		if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) {
    			Intent service = new Intent(this, DownloadService.class);
    			service.putExtra(DownloadService.INTENT_URL, dl);
    			startService(service);
    
    		} else {
    			Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(dl));
    			startActivity(intent);
    		}
    	}
    }
    


    2) 下载模块
    package com.example.updataapk;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    import android.app.Notification;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.app.Service;
    import android.content.Context;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Handler;
    import android.os.IBinder;
    import android.os.Message;
    import android.util.Log;
    import android.widget.RemoteViews;
    
    public class DownloadService extends Service {
    	// notification 名字
    	private String notify_name = "apk正在下载...";
    	public static final String INTENT_URL = "url";
    	private Context mContext = this;
    	Notification mNotification;
    	private static final int NOTIFY_ID = 0;
    	private NotificationManager mNotificationManager;
    	/* 下载包安装路径 */
    	private static final String savePath = Function_Utility.getUpgradePath();
    	private static final String saveFileName = savePath + "demo.apk";
    	private String apkUrl;
    	private int progress;
    	boolean canceled;
    	private Thread downLoadThread;
    
    	@Override
    	public IBinder onBind(Intent intent) {
    		return null;
    	}
    
    	@Override
    	public void onCreate() {
    		super.onCreate();
    		mNotificationManager = (NotificationManager) getSystemService(android.content.Context.NOTIFICATION_SERVICE);
    	}
    
    	public int onStartCommand(Intent intent, int flags, int startId) {
    		Log.i("DownloadService", "intent=" + intent.toString() + " ;           flags= " + flags + " ;    startId" + startId);
    		if (intent.hasExtra(DownloadService.INTENT_URL)) {
    			apkUrl = (String) intent.getExtras().get(DownloadService.INTENT_URL);
    		}
    		progress = 0;
    		setUpNotification();
    		new Thread() {
    			public void run() {
    				// 开始下载
    				startDownload();
    			};
    		}.start();
    
    		return startId;
    
    	};
    
    	private void startDownload() {
    		canceled = false;
    		downloadApk();
    	}
    
    	private Handler mHandler = new Handler() {
    
    		@Override
    		public void handleMessage(Message msg) {
    			super.handleMessage(msg);
    			switch (msg.what) {
    			case 0:
    				// 下载完毕
    				// 取消通知
    				mNotificationManager.cancel(NOTIFY_ID);
    				installApk();
    				break;
    			case 2:
    				// 这里是用户界面手动取消,所以会经过activity的onDestroy();方法
    				// 取消通知
    				mNotificationManager.cancel(NOTIFY_ID);
    				break;
    			case 1:
    				int rate = msg.arg1;
    				if (rate < 100) {
    					RemoteViews contentview = mNotification.contentView;
    					contentview.setTextViewText(R.id.tv_progress, rate + "%");
    					contentview.setProgressBar(R.id.progressbar, 100, rate, false);
    				} else {
    					// 下载完毕后变换通知形式
    					mNotification.flags = Notification.FLAG_AUTO_CANCEL;
    					mNotification.contentView = null;
    					mNotification.setLatestEventInfo(mContext, "下载完成", "文件已下载完毕", null);
    					stopSelf();// 停掉服务自身
    				}
    				PendingIntent contentIntent2 = PendingIntent.getActivity(getApplicationContext(), 0, new Intent(), PendingIntent.FLAG_UPDATE_CURRENT);
    				mNotification.contentIntent = contentIntent2;
    				mNotificationManager.notify(NOTIFY_ID, mNotification);
    				break;
    			case 3:
    				mNotification.flags = Notification.FLAG_AUTO_CANCEL;
    				RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.update_download_notification_layout);
    				contentView.setTextViewText(R.id.name, "下载失败");
    				// 指定个性化视图
    				mNotification.contentView = contentView;
    				Intent intent = new Intent(getApplicationContext(), MainActivity.class);
    				PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    
    				// 指定内容意图
    				mNotification.contentIntent = contentIntent;
    				mNotificationManager.notify(NOTIFY_ID, mNotification);
    
    				stopSelf();// 停掉服务自身
    				break;
    
    			}
    		}
    	};
    
    	/**
    	 * 安装apk
    	 * 
    	 * @param url
    	 */
    	private void installApk() {
    		File apkfile = new File(saveFileName);
    		if (!apkfile.exists()) {
    			return;
    		}
    		Intent i = new Intent(Intent.ACTION_VIEW);
    		i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    		i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");
    		mContext.startActivity(i);
    	}
    
    	private int lastRate = 0;
    	private InputStream is = null;
    	private FileOutputStream fos = null;
    
    	/**
    	 * 下载apk
    	 * 
    	 * @param url
    	 */
    	private void downloadApk() {
    		downLoadThread = new Thread(mdownApkRunnable);
    		downLoadThread.start();
    	}
    
    	private Runnable mdownApkRunnable = new Runnable() {
    
    		@Override
    		public void run() {
    			try {
    				URL url = new URL(apkUrl);
    				HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    				conn.connect();
    				int length = conn.getContentLength();
    				is = conn.getInputStream();
    
    				File file = new File(savePath);
    				if (!file.exists()) {
    					file.mkdirs();
    				}
    				String apkFile = saveFileName;
    				File ApkFile = new File(apkFile);
    				fos = new FileOutputStream(ApkFile);
    
    				int count = 0;
    				byte buf[] = new byte[1024];
    
    				do {
    					int numread = is.read(buf);
    					count += numread;
    					progress = (int) (((float) count / length) * 100);
    					// 更新进度
    					Message msg = mHandler.obtainMessage();
    					msg.what = 1;
    					msg.arg1 = progress;
    					if (progress >= lastRate + 1) {
    						mHandler.sendMessage(msg);
    						lastRate = progress;
    					}
    					if (numread <= 0) {
    						mHandler.sendEmptyMessage(0);// 下载完成通知安装
    						// 下载完了,cancelled也要设置
    						canceled = true;
    						break;
    					}
    					fos.write(buf, 0, numread);
    				} while (!canceled);// 点击取消就停止下载.
    				Log.i("DownloadService----------canceled", canceled + "");
    				fos.close();
    				is.close();
    			} catch (Exception e) {
    
    				Message msg = mHandler.obtainMessage();
    				msg.what = 3;
    				mHandler.sendMessage(msg);
    				e.printStackTrace();
    			} finally {
    				try {
    					if (fos != null) {
    						fos.close();
    					}
    					is.close();
    					if (is != null) {
    						is.close();
    					}
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    
    		}
    	};
    
    	/**
    	 * 创建通知
    	 */
    	private void setUpNotification() {
    		int icon = R.drawable.ic_launcher;
    		CharSequence tickerText = "开始下载";
    		long when = System.currentTimeMillis();
    		mNotification = new Notification(icon, tickerText, when);
    		;
    		// 放置在"正在运行"栏目中
    		mNotification.flags = Notification.FLAG_ONGOING_EVENT;
    
    		RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.update_download_notification_layout);
    		contentView.setTextViewText(R.id.name, notify_name);
    		// 指定个性化视图
    		mNotification.contentView = contentView;
    
    		PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(), PendingIntent.FLAG_UPDATE_CURRENT);
    
    		// 指定内容意图
    		mNotification.contentIntent = contentIntent;
    		mNotificationManager.notify(NOTIFY_ID, mNotification);
    	}
    
    }
    

    3) 下载到手机的地址 
    package com.example.updataapk;
    
    import java.io.File;
    import java.io.IOException;
    
    import android.annotation.SuppressLint;
    import android.content.Context;
    import android.os.Environment;
    
    @SuppressWarnings("deprecation")
    @SuppressLint({ "DefaultLocale", "SimpleDateFormat" })
    public class Function_Utility {
    
    	private static Context mAppContext;
    
    	public static void setAppContext(Context context) {
    		mAppContext = context;
    	}
    
    	public static Context getAppContext() {
    		return mAppContext;
    	}
    
    	/**
    	 * 下载到SD卡地址
    	 */
    	public static String getUpgradePath() {
    		String filePath = getAppRootPath() + "/upgrade/";
    		File file = new File(filePath);
    		if (!file.isDirectory()) {
    			file.mkdirs();
    		}
    		file = null;
    		return filePath;
    	}
    
    	public static String getAppRootPath() {
    		String filePath = "/weimicommunity";
    		if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
    			filePath = Environment.getExternalStorageDirectory() + filePath;
    		} else {
    			filePath = getAppContext().getCacheDir() + filePath;
    		}
    		File file = new File(filePath);
    		if (!file.exists()) {
    			file.mkdirs();
    		}
    		file = null;
    		File nomedia = new File(filePath + "/.nomedia");
    		if (!nomedia.exists())
    			try {
    				nomedia.createNewFile();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		return filePath;
    	}
    }
    

    4) Androidmanifest.xml
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.updataapk"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="17" />
    
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.example.updataapk.MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
            <service android:name="com.example.updataapk.DownloadService" >
            </service>
        </application>
    
    </manifest>

    效果图:


    下载完成后 自动安装
    Demo 下载地址:

    http://download.csdn.net/detail/aaawqqq/8040081

    展开全文
  • Android 更新UI的两种方法——handler和runOnUiThread() 在Android开发过程中,常需要更新界面的UI。而更新UI是要主线程来更新的,即UI线程更新。如果在主线线程之外的线程中直接更新页面显示常会报错。抛出异常...
  • cocos2d-x C++通知Android更新UI

    千次阅读 2012-05-03 18:46:32
    C++通知Android更新UI 今天遇到一个问题,就是移植到android上的游戏在主界面显示广告,进入游戏有隐藏广告。 看看我实现的方法。 1、游戏启动时在java这边的xml里面放了一个view放置广告。在oncreate的...
  • Android更新下载进度条

    万次阅读 2011-02-14 10:58:00
    下载文件会阻塞UI主线程,所以需要new一个新线程来执行下载操作,通过handler执行更新UI进度条操作。代码如下: public class AndroidTest extends Activity { private static final String TAG = ...
  • Android更新带进度条的通知栏

    万次阅读 多人点赞 2015-08-06 15:47:05
    在网上查询了下,Android版本更新通知栏带进度条,醉了,基本都是复制过来,有的代码不全,连源码下载都没有,有下载也需要积分,还不能用,真黑心啊!!之前自己也写过自定义通知栏Notification,想了还是自己写吧...
  • 2.如果一定得耗时,我想在加载的时候显示一个progressDialog,更新UI语句全在主线程一个foreach()循环里,我在foreach前showDialog,在foreach后dismiss,发现似乎是没有效果,网上查到的使用方法都是子线程里发消息...
  • Android 更新API详细

    千次阅读 2013-11-08 16:03:10
    做一下笔记吧,N久没有配置SDK了,今天弄这个...Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xml Fetched Add-ons List successfully Fetching URL: https://dl-ssl.google.com/android/rep
  • android更新媒体库

    千次阅读 2012-03-12 16:15:25
    android在抓图后如果不通知更新媒体库,是不能及时在Gallery中查看图片的。 /*更新媒体库,扫描抓图文件*/ Uri data = Uri.parse("file://"+filepath+filename); sendBroadcast(new Intent(Intent.ACTION_MEDIA_...
  • Android 更新runOnUiThread()

    万次阅读 2013-09-24 18:00:28
    Activity类的runOnUiThread方法你用过吗,如果你对于Android的Thread+Handler方式感觉繁琐,不妨试试Activity提供的另外一种简单的方法runOnUiThread,runOnUiThread可以帮助你在线程中执行UI更新操作,我们只需要在...
  • Android 更新UI 只能在主线程?

    千次阅读 2016-09-13 20:22:32
    今天中午去吃饭的时候,zk问了我一个问题,“Android只能在UI线程更新UI 么”,我的回答是“对”。然后zk让我回去写在子线程中更新UI,看会有什么问题。一、三个子线程更新UI下午空闲的时候,就带着zk的疑问,写了这...
  • Android更新及gradle3.0问题

    千次阅读 2018-04-18 11:09:18
    问题:Configuration 'compile' is obsolete and has been replaced with 'implementation' ...'com.android.support:appcompat-v7:25.4.0' } 即可 原因:经查看日志可得,compile以不再支持,所以引用implement即可。
  • Android开发过程中,常需要更新界面的UI。而更新UI是要主线程来更新的,即UI线程更新。如果在主线线程之外的线程中直接更新页面显示常会报错。抛出异常:android.view.ViewRoot$CalledFromWrongThreadException: ...
  • 问题:android 更新sdk23以后,报错提示FloatMath.ceil()和FloatMath.sin()方法不存在 分析:出现这个问题是Android6.0不支持FloatMath.sin()了,主要有两个方法可以解决。 解决: 1,用23一下的SDK版本进行编译。...
  • 本片文章主要介绍了自己服务器更新和GooglePlay更新的解决方案,不包含其他第三方(如Umeng、其他应用市场等)更新
  • android更新ADT到最新版本出错

    千次阅读 2013-01-18 15:09:26
     昨天新接触了一个技术点:android和i2c通信,由于硬件设备是android4.0.4,而我安装的eclipse android最高版本是android4.0.3,查了一下,貌似木有android4.0.4的ADT,所以我觉得更新到最新版本(目前android4.2)...
  • Android系统升级到7.0以上后发现,所有的APP升级,下载完成后不自动跳转到安装界面,找到如下解决办法,完美 1、指定访问的文件的路径 在res下,创建xml文件夹,创建file_paths.xml文件 2、file_paths.xml...
  • android 更新Preference的UI显示

    千次阅读 2012-09-12 12:08:13
    更新Preference    当我们在编辑完一个preference的sub Preference的数据设置后,在sub里面修改outPrefs后,返回后发现out Prefs并没有改变。如何实时更新嗯?   PreferenceScreen usersListScreen = ...  ...
  • 问题描述在做Android应用版本更新时遇到一个问题,在原始的版本中进行升级,下载了新版的app后安装时,手机报“应用未安装”,升级失败。 如下图所示: 分析原因主要有两个方面的原因: 软件的签名不一致。比如APP...
  • Android更新Ui的几种方法和见解

    万次阅读 2015-04-18 19:29:33
    先贴一个我们刚做Android开发时候最容易遇到的一个错误异常 AndroidRuntimeException :“Only the original thread that created a view hierarchy can touch its views”  具体原因是当我们在对ui做出更改时,...
  • 今天更新了eclipse,顺便更新android ADT,然后发现运行的程序报找不到引用的jar错误。 网上查查,发现是android ADT 更新到22.0.1后,原先引用的jar在 referenced libraries 下,更新后改为:Android Private ...
  • Android UI 中提供invalidate()来更新界面,而invalidate()方法是非线程安全,所以需要借助handler实现。 main.xml: <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+...
  • 总结了一下更新歌曲播放进度条的三种方法 1. 只使用handler来进行更新  2. 使用计时器Timer+TimerTask  3. 使用线程池ExecutorService  实现后的效果图: 下面详细讲一下三种做法 方法一 使用handler来...
  • 更新完成android sdk后创建了项目,然后选择的sdk版本是android 21,系统自动创建了v7的资源项目,然后本项目引用了该v7. 可是问题来了,v7资源项目里的res资源属性报错,no found missing!!!!WTF v7也是21...
  • androidURL not found 。可以试下:启动 Android SDK Manager ,打开主界面,依次选择Tools、Options... 在 HTTP Proxy Server 和 HTTP Proxy Port 输入框内填入mirrors.neusoft.edu.cn和80,并且选中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 67,275
精华内容 26,910
关键字:

android更新